perm filename ALLDAT.17B[J17,SYS] blob sn#109716 filedate 1974-07-08 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00040 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00005 00002	DATA AREA FOR SAUNDERS DISK SERVICE - JAM 10-20-69
C00009 00003	BEGIN DSKDAT
C00013 00004	DSKDDB: THE DUMMY DEVICE DATA BLOCK IS THE FIRST ONE IN THE CHAIN.
C00017 00005	↑HA:	0
C00021 00006	↑D2INT:	0				JSR HERE FROM 144
C00023 00007	MORE DATA FOR D2CHN
C00024 00008	BEGIN DPYDAT
C00026 00009	   NOW THE DPY PROGRAM HEADERS.  
C00034 00010	↑STRTBL:BLOCK DPYNUM	THIS TABLE, INDEXED BY DISPLAY NO.,
C00037 00011	 DATA DISK DATA STORAGE
C00044 00012	BEGIN DTCDDB
C00046 00013	UNIT←DTCNUM-1
C00047 00014	TEMPORARY STORAGE FOR DECTAPE SERVICE
C00050 00015	IFN FTDISK,<
C00052 00016	BEGIN LPTDDB
C00054 00017	BEGIN XGPDDB	↔ SUBTTL DATA STORAGE FOR XGP SERVICE
C00062 00018	BEGIN PTRDDB -- PAPER TAPE READER DEVICE DATA BLOCK
C00063 00019	BEGIN PTPDDB -- PAPER TAPE PUNCH DEVICE DATA BLOCK
C00067 00020	BEGIN SCNDDB
C00070 00021	FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS:
C00073 00022	SCANNER DEVICE DATA BLOCK.
C00076 00023	↑LINSAV: 0
C00077 00024	DIALER DATA AREA
C00078 00025	BEGIN MTCDDB  --  DEVICE DATA BLOCK FOR MAG TAPES.
C00079 00026		UNIT←MTCNUM-1
C00081 00027	BEGIN SPWDAT -- DATA FOR SPACEWAR
C00082 00028	SCHEDULER DATA AREA . . .
C00086 00029	SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)
C00088 00030	DATA AREA FOR CORE MANAGEMENT SYSTEM
C00090 00031	FREE STORAGE PARAMETERS
C00093 00032	SPARE LIST CONTROL BLOCKS
C00095 00033	BEGIN TVDDB -- TV CAMERA DEVICE DATA BLOCK
C00096 00034	IFN ELFNUM <SUBTTL ELFDDB - PDP-11 BARE MACHINE MODE
C00097 00035	BEGIN ADDDB -- DEVICE DATA BLOCK FOR A/D AND D/A.
C00099 00036	BEGIN ADCDDB - NEW AD/DA CONVERTER - (JAM 2-5-74)
C00102 00037	BEGIN APRDAT	↔	SUBTTL	APRDAT 7 NOV 68	APRSER DATA
C00111 00038	↑SYSBEG←←.		HERE TO SYSEND ZEROED AT RELOAD OR INITIALIZATION
C00122 00039		DATA AREA FOR PARITY SERVICE
C00124 00040	 STATISTICS COUNTERS
C00130 ENDMK
C⊗;
SUBTTL DATA AREA FOR SAUNDERS DISK SERVICE - JAM 10-20-69
;TEMP STORAGE &C. FOR DSKSER

↓DSKADR←←14B18		;3330 DEVICE ADDRESS
↓TRKCYL←←=19		;TRACKS PER CYLINDER
↓SNSLEN←←=24		;NUMBER OF SENSE BYTES
↓BKPTRK←←1		;1 BLOCK PER TRACK FOR NOW
↓RCPBLK←←22		;NUMBER OF RECORDS PER BLOCK
↓FPACKS←←4		;NUMBER OF FILE SYSTEM PACKS;
↓UPACKS←←2		;NUMBER OF USER DISK PACKS
↓NPACKS←←FPACKS+UPACKS	;NUMBER OF PACKS (INCLUDING SWAPPING/UDP PACK)

↓SECSIZ←←40		;WORDS/DISK SECTOR
↓RECSIZ←←200		;RECORD SIZE
↓RECWSH←←7		;RECSIZ LOG 2
↓CRMAX←←RCPBLK+1	;TOTAL RECORDS PER BLOCK (INCLUDING RETRIEVAL)
↓BKPGRP←←2*20		;16 WORDS OF HALFWORD PTRS.
↓BKDSIZ←←RECSIZ*RCPBLK	;BLOCK DATA AREA SIZE
↓BLKWDS←←BKDSIZ+SECSIZ	;TOTAL BLOCK SIZE (INCLUDING RTVL).
↓RCPGRP←←RCPBLK*BKPGRP	;RECORDS/GROUP.
↓RCPTRK←←BKPTRK*CRMAX	;NUMBER OF RECORDS PER TRACK INCL. RETRIEVAL


↓NSATBK←←1		;NUMBER OF BLOCKS NEEDED FOR SAT TABLE.

;PACKAD IS A TABLE THAT CONTAINS THE LAST LEGAL PHYSICAL TRACK NUMBER FOR
;ANY GIVEN DISK PACK.
	-1		;FOR REFERENCE TO PACKAD-1
PACKAD:
RADIX =10
ZZZ←←0			;PACK NUMBER
TTRK←←0			;TOTAL TRACKS SO FAR
FOR @' I IN (400,400,800,800,400,400) <
CAT(↓NCYL,\ZZZ)←←I			;NUMBER OF CYLINDERS FOR THIS PACK
CAT(↓NTRK,\ZZZ)←←I*TRKCYL		;NUMBER OF TRACKS FOR THIS PACK
CAT(↓TTRK,\ZZZ)←←TTRK←←TTRK+I*TRKCYL	;TOTAL TRACKS
ZZZ←←ZZZ+1
	TTRK-1				;LAST LEGAL TRACK IN THIS PACK
>
IFN .-PACKAD-NPACKS,<
	.FATAL NPACKS ≠ NUMBER OF PACKS AT PACKAD
>

↓NXTRA0←←11		;NUMBER OF EXTRA CYLINDERS ON PACK 0

RADIX 8

↓LSTBIT←←CAT(TTRK,\<FPACKS-1>)-NSATBK	;LAST LOGICAL TRACK # IN FILE SYS (NOT UDP)
↓SATWCT←←(((LSTBIT/44)+=10)/=10)*=10	;NUMBER OF WORDS IN SAT BIT-TABLE
			;CONTRIVED TO A MULTIPLE OF =10 FOR SOME UNKNOWABLE PURPOSE
↓LSTADR←←TTRK-NSATBK	;LAST LOGICAL TRACK NUMBER (INCLUDING UDP)
↓LSTTRK←←TTRK-1		;LAST LEGAL PHYSICAL TRACK NUMBER (INCLUDING UDP)

;NCYLSH IS A TABLE CONTAINING THE NUMBER OF CYLINDERS FOR EACH PACK
;EACH ENTRY IS SHIFTED LEFT 4 BITS.  USED AT READDN IN HPIC
↓NCYLSH:	
FOR @' I ← 0,NPACKS-1 <
	NCYL'I⊗4
>
BEGIN DSKDAT

↑BADMAX←←=46			;MAX NO. OF BAD TRACKS.
↑QQSIZ←←30			;NEED NOT BE > NUMBER OF DDB'S.
↑QBEGIN:	BLOCK QQSIZ	;INTERRUPT SUBR REQUEST QUEUE
↑QEND:	0
↑LBEGIN:	BLOCK QQSIZ	;LOG OF I-SUBR CALLS FOR DEBUGGING
↑LOGEND:	0
↑MIPTR:	0
↑MOPTR:	0
↑UPTR:	0			;UDP I-SUBR REQUEST CELL
↑DFBUSY:	0		;FLAG TO INDICATE I-SUBR ACTIVITY.
↑DQCNT:	0			;NUMBER OF LOSERS CURRENTLY IN DISK QUEUE

↑TFRRTN:	0		;WHERE IN I-SUBR TO RTN TO WHEN XFER DONE
↑INTRTN:	0		;WHERE TO GO TO DISMISS INTERRUPT
	GLOBAL CH6SAC
↑UUOACS←←CH6SAC

↑DSKACS:	BLOCK 20	;I-LEVEL AC'S SAVED HERE BETWEEN INT'S
↑DSKPDL:	BLOCK 50	;PRIVATE PDL FOR DSKSER CH6 OPS

↑DSKSV:	0
	MOVEM 17,UUOACS+17
	MOVEI 17,UUOACS
	BLT 17,UUOACS+16	;SAVE USER'S ACS IN COMMON CH6 AREA.
	MOVE 3,[XWD -50,DSKPDL-1]
	PUSHJ 3,@DSKSV		;SERVICE INTERRUPT.
	MOVSI 17,UUOACS		;RETURN HERE TO DISMISS;
	BLT 17,17		;RESTORE USER'S AC'S.
	JEN @DSKCHL

↑DSKEDD:	0		;ERROR VERSION OF ABOVE
↑ACDDB:	0			;LAST DDB FOR BAD AUDIT
↑SWPDDB:	0		;UDP DDB FOR SWAPPING
↑ERRBIT:	0		;ERROR BITS FOR LAST XFER
↑DSKERB:	0		;ERROR BITS (LH=IOP, RH=DISC)
↑DSKJB:	0
↑DSKMA:	0
↑DXB:	0			;CURRENT DDB
↑DXC:	0			;CURRENT TFRCTL
↑DXJ:	0			;JOB NUMBER
↑DXP:	0			;LAST STACK PTR
↑DXS:	0			;CURRENT TFRSEC
↑DXW:	0			;CURRENT TFRIOW

↑SYSBUF:	BLOCK SECSIZ	;RETRIEVAL PART OF SYSTEM BUFFER
↑SYSDTA:	BLOCK BKDSIZ	;DATA PART
↑QBUF:		BLOCK SECSIZ
↑BKIN:	0			;PRESENT OCCUPANT OF SYSBUF
↑DFTEMP:	0		;SCRATCH CELL.

↑SATFLG:	0		;INDICATES CHANGE, WRITEOUT RQD
↑SATMOD:	-1		;I/O DIRECTION. USED BY ACISAT ETC.
				;-1:READ    0:WRITE	THE SAT TABLE.

;SAT TABLE AS STORED ON BLOCK 0 OF THE DISK
↑SATTAB:			;THIS IS SAT BIT AREA AS STORED ON DISK.
↑DSKUSE:	0		;BLOCKS USED ON DISK
↑LSTBLK:	0		;NUMBER OF LAST BLOCK ASSIGNED
↑SATID:		0		;IDENT.NO. OF ALL DISK INFO
↑SATCHK:	0		;XOR CHECKSUM OF SAT BITS BELOW
↑BADCNT:	0		;NO. OF BAD TRACKS IN TABLE BELOW.
↑BADCHK:	0		;CHECK (SUM) OF TABLE.
↑BADTRK:	BLOCK BADMAX	;TABLE OF BAD LOGICAL BLOCKS (TRACKS)
↑DTIME:		0		;TIME SAT LAST WRITTEN
↑DDATE:		0		;DATE SAT LAST WRITTEN
↑P1OFF:		0		;# PDP-10 POWER FAILURES
↑P2OFF:		0		;# OF PDP-6 POWER FAILURES
		0		;BUFFER WORD.
↑SATBIT:	BLOCK SATWCT	;MOD TEN FOR CHECKSUM SPEED/EASE.
↑SATEND:	0
↑SATSIZ←←SATEND-SATTAB

IFG SATSIZ-BLKWDS*NSATBK,<
.FATAL	SAT TOO BIG FOR THE DISK SPACE ALLOCATED. INCREASE NSATBK AND PRAY
>
;DSKDDB: THE DUMMY DEVICE DATA BLOCK IS THE FIRST ONE IN THE CHAIN.

	DEFINE ZWD' (A)<
	↑A←←.-DSKDDB
;	INTERNAL A
	0	>

	DEFINE ZLOC' (A)<
	↑A←←.-DSKDDB
;	INTERNAL A	>

;	INTERNAL DSKDDB
REPEAT DDBSKW-1,<0>
	DEVAOA!DEVSHR,,0	;EXTRA WORD FOR MORE GOOD BITS
↑DSKDDB:SIXBIT /DSK/		;DEVNAM
	XWD =60*HUNGST,201	;DEVCHR
	0			;DEVIOS
	XWD UDP0DD,DSKDSP	;DEVSER. NEXT DDB IS UDP.
	XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403	;DEVMOD
	0			;DEVLOG
	0			;DEVBUF
	XWD PROG,0		;DEVIAD
	XWD PROG,0		;DEVOAD

	;NEXT 8 LOCATIONS COPIED FOR AUDITOR
	ZWD FILNAM
	ZWD FILEXT
	ZWD FILPRO
	ZWD FILPPN
	ZWD FILLOC
	ZWD FILLNG
	ZWD REFTIM
	ZWD DMPTIM

	ZWD USETP
	ZWD UFDPRO		;PROTECTION OF THE UFD FROM WHICH FILE CAME
	ZWD UFDPR1		;TEMP COPY OF ABOVE WHILE DOING RENAME
				;ALSO, RH← LH(DQINFO+3) OF UFD LAST ACCESSED

	ZWD ACCNAM
	ZWD ACCEXT
	ZWD ACCPRO
	ZWD ACCPPN

	ZWD SRCNAM
	ZWD SRCEXT
	ZWD SRCPRO
	ZWD SRCLOC
	ZWD SRCTMP
	ZWD DMPBUF

	ZWD TFRSEC
	ZWD TFRIOW
	ZWD TFRCTL

	ZWD DSKFAD
	ZWD DSKLAD
	ZWD CORFAD
	ZWD CORLAD

	ZLOC DSKDAT;	BEGIN GRP-DEPENDENT PART OF DDB
	ZWD DDNAM
	ZWD DDEXT
	ZWD DDPRO
	ZWD DDPPN
	ZWD DDLOC
	ZWD DDLNG
	ZWD DREFTM
	ZWD DDMPTM
	ZWD DGRP1R;	FIRST USER RCRD NO. THIS GRP
	ZWD DNXTGP;	BLOCK NUMBER OF NEXT GROUP
	ZWD DSATID
	ZWD DQINFO	;START OF SPECIAL STORAGE FOR LOGIN ETC.
	BLOCK 17+DSKDDB+DSKDAT-.
↑↑DQLEN←←.-DSKDDB-DQINFO
	ZWD DOFFST	;RECORD OFFSET
	ZLOC DPTR;	RETRIEVAL DATA,
	BLOCK 20	;2 BLK NO.'S/WORD
	ZLOC DDEND
↑DDBSIZ←←.-DSKDDB+DDBSKW

FOR @$ UNUM←0,UPACKS-1
{REPEAT DDBSKW-1,<0>
	DEVAOA!DEVLUP,,0
↑UDP$UNUM$DD:
	SIXBIT /UDP$UNUM/
	XWD =30*HUNGST,UNUM⊗PUNITP
	0			
IFN UNUM-UPACKS+1,<
	CAT(CAT(UDP,\<UNUM+1>),DD),,UDPDSP	
;>	PTRDDB,,UDPDSP
	XWD DVUDP!DVOUT!DVIN!DVDIR!DVLNG,100000	
	0			
	0			
	XWD PROG,0		
	XWD PROG,0		
	
	BLOCK <DDBSIZ-UDP$UNUM$DD+.>		;MAKE SAME SIZE AS DSKDDB.
↑UDPOFF←←.-UDP$UNUM$DD
	CAT(TTRK,\<FPACKS+UNUM-1>)		;OFFSET TO FIRST BLOCK OF THIS UDP
}

↑SYSRTV←←SYSBUF-DSKDAT	;FOR REFERRING TO DDXXX IN SYSBUF
↑HA:	0
	0
	0

;HERE ARE VARIOUS PIECES OF DATA.

↑PMPCNI:	0
↑DSKLRN:	0		;LOGICAL DISK ADDRESS FOR THIS XFER.

↑DSKHNG:	0		;DISK HUNG COUNTING CELL, COUNTED DOWN BY DEVCHK
↑DHNGST:	0		;DSKHNG SET FROM HERE ON EACH DSK INTERRUPT
↑DRAUFO:	0
↑DSKOPS:	BLOCK	JOBN	;NUMBER OF DISK OPERATIONS FOR EACH JOB
↑DSKOVC:	0
↑STAC:		0
↑STAC1:		0
↑SAC3:		0
↑SDAT:		0
↑SAVP:		0
↑INTPDL:	0


↑SKCMD:		36007!DSKADR	;SEEK COMMAND.
↑SKWCMA:	SKDAT
↑SCCMD:		36461!DSKADR	;SEARCH COMMAND,WITH CHAIN & SKIP IF OFF
↑SCWCMA:	SCDAT

;FOLLOWING MUST BE IN ORDER:

↑RCMD:	22006!DSKADR		;READ COMMAND
↑WCMD:	22005!DSKADR		;WRITE COMMAND
	16555!DSKADR	;"USE" MODE. SRCH KEY/DATA EQ-HI.
	16455!DSKADR	;"OWN" MODE. SRCH KEY/DATA EQ.

;NEXT 2 LOCS ARE A TABLE!
		SKIPL TAC		;READ END TEST
↑ENDTAB:	CAML TAC,[-1,,0]	;WRITE END TEST

↑SNSCMD:	34004!DSKADR	;SENSE COMMAND.(4 BYTE MODE)
↑SNWCMA:	SNSDAT
↑SNSDAT:	BLOCK SNSLEN/4	;SENSE PUTS DATA HERE.(4 BYTES PER WORD)
		0
↑RCALCM:	23!DSKADR	;RECALIBRATE THE SEEK HYDRAULICS.
↑RDHACM:	34032!DSKADR	;READ HOME ADDRESS.(4 BYTE MODE)
↑NOPCMD:	3!DSKADR	;NO-OP COMMAND

;COMMANDS FOR DIAGNOSTIC LOAD AND WRITE

↑DWCMD:		36163!DSKADR	;DIAGNOSTIC WRITE
↑MSKCMD:	22037!DSKADR	;SET FILE MASK
↑DLCMD:		36123!DSKADR	;DIAGNOSTIC LOAD
↑RD1CMD:	34104!DSKADR	;READ DIAGNOSTIC STATUS 1

↑FILMSK:	BYTE(8)4	;PERMIT DIAGNOSTIC WRITE COMMAND


;COLLECT ERROR COUNTS HERE
↑ERRCL0:	0
↑ERRCL1:	0
↑ERRCL2:	0
↑ERRCL3:	0
↑ERRCL4:	0
↑ERRSNS:	0
↑ERRHA:		0
↑ERRRCL:	0
↑SHADPE:	0

;THESE ARE THE HARD ERROR MAXIMUMS!
↑MAXCL0:	100
↑MAXCL1:	100
↑MAXCL2:	100
↑MAXCL3:	100
↑MAXCL4:	100
↑MAXSNS:	10
↑MAXHA:		10
↑MAXRCL:	10

;THESE ARE THE MASKS FOR WHEN TO PRINT AN ERROR CLASS
;THEY MUST BE -2**N-1 FOR TDNE
↑TYMSK0:	¬10
↑TYMSK1:	¬10
↑TYMSK2:	¬10
↑TYMSK3:	¬10
↑TYMSK4:	¬20

;COLLECT TOTAL COUNTS HERE
↑TOTCL0:	0
↑TOTCL1:	0
↑TOTCL2:	0
↑TOTCL3:	0
↑TOTCL4:	0

;SET THESE FLAGS TO FORCE TYPEOUT OF EVERY ERROR
↑TYPCL0:	0
↑TYPCL1:	0
↑TYPCL2:	0
↑TYPCL3:	0
↑TYPCL4:	0

↑DSKACT:	0	;FLAG DISK CHANNEL ACTIVE

↑DEATH:		0	;ERROR ROUTINE HAS DECREED DEATH TO THE INFIDEL'S

↑TYPANY:	0
↑SNSTYP:	0
↑CSTOP:		0
↑ERRCMD:	0
↑CNISAV:	0
↑XDSKMA:	0

↑HNGFLG:	0
↑CT:		0
↑LCT:		0
↑WCT:		0
↑HAFLAG:	0
↑DSKFLG:	0
↑D2INT:	0				;JSR HERE FROM 144
	MOVEM TAC,TSAV
	CONI PMP,TAC			;GET STATUS
	TRNN TAC,NEWST!UNEND		;NEW STATUS OR UNUSUAL END?
	JRST ITEST			;NO.  PERHAPS CHDEMP
	XOR TAC,TSTXOR
	TDNN TAC,TSTBIT			;SKIP IF LOSING.
	TRNN TAC,DEVEND!CHNEND		;ONE OF THESE OUGHT TO BE ON IF NEW STATUS
	JRST D2XE			;SOMETHING EVIL THIS WAY COMES.
	XOR TAC,TSTXOR			;RESTORE ORIGINAL CONI BITS FOR COROUTINES
	CONO IBM,CNEWST			;CLEAR NEW STATUS
	CONSO PMP,CHDEMP		;GOT DEV END, CMD HLD EMPTY?
	JRST D2X1
	JRST @D2X			;CMD HLD EMPTY.  CONTINUE IN COROUTINE

↑D2X:	0
D2X1:	CONO IBM,ACTCLR
D2X2:	EXCH TAC,TSAV
	JRST 12,@D2INT

D2XE:	XOR TAC,TSTXOR			;RESTORE CONI BITS
	CONO PMP,NEWST!UNEND!10!DSKCHN	;MAKE LOW PRIORITY CHANNEL HANDLE THIS
	EXCH TAC,LSTAT			;STORE LOSING STATUS
	JRST D2X2

ITEST:	SKIPN DSKACT		;SHOULD WE BE HERE AT ALL?
	JRST D2BARF		;NO
	TRNE TAC,20		;IS DISK INTERRUPTING AT ALL?
	TRNE TAC,4		;IS HE IN LOWER CHANNEL?
	JRST D2BARF
	JRST @D2X		;ALL IS WELL?

↑D2BARF:EXCH P,ERRPD		;SAVE P AND GET A PDL
	PUSHACS
	PUSHJ P,DISMES
	ASCIZ/
IN THE DISK CHANNEL WITHOUT AN INTERRUPT. GET A WIZARD.
/
	SETOM DISFLAG
	PUSHJ P,DISFLUSH
	HALT .+1
	POPACS
	EXCH P,ERRPD
	JRST D2X2
;MORE DATA FOR D2CHN
↑SKDAT:	BLOCK 2
↑SCDAT:	BLOCK 2
↑XWCMA:	0

↑LSTREC:	0

↑ENDTST:	0

↑XWRAP:		0
↑TSAV:		0
↑LSTAT:		0
↑D2DONE:	0
↑D2LUZ:		0
↑LWCMA:		0
↑LSTOP:		0
↑XCMD:		0
↑CHNEMP:	0
↑TSTXOR:	DSKADR⊗12!20		;PACK NUMBER DPB'ED HERE
TSTBIT:		37700,,UNEND!ATTN!CUEND!BUSY!UCHK!UXCPTN!20
↑SATID1:	0		;FIRST COPY OF SATID
↑SATID2:	0		;SECOND COPY OF SATID
BEND DSKDAT
BEGIN DPYDAT
SUBTTL III AND DATA DISK DATA STORAGE

;; NOW SOME DISPLAY OPCODES AND MACROS FOR GENERATING DP INSTRS.

DISJMP←←20	;DP JMP INSTR. OPCODE.
DISJMS←←4	; JMS (STORES TWO WORDS)
DISJSR←←24	; STORES ONLY RETURN ADDR.
DISRST←←14	;RESTORE.
DISSEL←←10	;SELECT.
DISNOP←←14	;ACTUALLY RST, BUT A GOOD NOP WITH ALL BITS OFF.
DISSKP←←12	; TEST AND SKIP
DISKPN←←32	; TEST AND NOT SKIP

DEFINE LVW(X,Y,TYPE,MODE,BRT,SIZ)	;ASSEMBLES A LONG VECTOR.
  { MVW1 (MODE,TYPE,BRT,SIZ)	;TWIDDLE PARAMS.
	BYTE (11)<X>,<Y>(3)B,S(2)MD,TT(3)3 ⎇	;ASSEMBLE INSTR.
DEFINE MVW1 (M,T,BRT,SIZ)
 {IFIDN {M⎇{A⎇{MD←1;⎇MD←0	;MODE = `A' FOR ABSOLUTE.
  IFIDN {T⎇{I⎇{TT←2;⎇TT←0	;TYPE = `I' FOR INVISIBLE.
  IFIDN {BRT⎇{⎇{B←0;⎇B←BRT	;BRT = 0 IF OMITTED.
  IFIDN {SIZ⎇{⎇{S←0;⎇S←SIZ	;SAME FOR SIZ.
⎇
DEFINE CW (C1,B1,C2,B2,C3,B3) {<BYTE (8)<B1>,<B2>,<B3>(3)<C1>,<C2>,<C3>>!4}
COMMENT ⊗   NOW THE DPY PROGRAM HEADERS.  
 THERE IS ONE OF THESE FOR EACH DPY PROGRAM
 IN EXISTENCE; IN GENERAL, ONE FOR EACH CONSOLE PLUS
 ONE FOR EACH DETACHED JOB DOING DPY OUTPUT. THE HEADERS
 AND THE START,RESTART, AND STOP TABLES ARE THE ONLY PARTS
 OF THE WHOLE INCREDIBLE DPYSER DATA STRUCTURE WHICH DO NOT
 GO IN FREE STORAGE.
⊗

↑BUFL←←40		; EDITING BUFFER IS THIS MANY WORDS LONG
		ZZQ←←.
		DEFINE Z(FOO){↑FOO←←.-ZZQ
}		
 	
		XWD .+3,DISRST+40
			;PRGM. NORMALLY STARTED HERE. 
			;  RESTORE PRIOR STATE OF DP.
Z(PSELC)	BYTE (12),7777,DISSEL	;FIRST DESELECT ALL CONSOLES
Z(PSELA)	BYTE (12)1⊗(=11-0),,DISSEL	;THEN RESTORE OLD SELECTION
Z(PRGSTP)	0	;PRGM IS STOPPED BY A JMS TO HERE.
Z(PRGSAV)	0
Z(WHOCALL)	DISNOP	;CALL WHO LINE(IF ANY).
Z(PPCALL)	DISNOP	;HERE IS A JMP TO PAGE 0 OF PP.
Z(LEPOS)	DISNOP
Z(LEJMS)	XWD ZZQ+LEB,DISJMS
			;CALL THE LINE EDITOR.
Z(PGCALL)	DISNOP	;HERE A JMP TO PIECE OF GLASS CONT. BLK.
		0	;HERE PRGM NORMALLY HALTS.
Z(PSELB)		;ANOTHER COPY OF SELECT WORD. PRGM RESTARTS HERE.
		BYTE (12)1⊗(=11-0),¬(1⊗(=11-0)),DISSEL
Z(RTJMP)	XWD WHOCALL+ZZQ,DISJMP

Z (PRGNUM)	0	;NO. OF DPY THIS PRGM ATTACHED TO.
Z (BLKTOT)	-7	;NO. OF BLOCKS OF STORAGE HE CAN USE.
Z(CURPP)	0	;PTR. TO CTRL. BLK. OF SELECTED P OF P.
Z(CURPG)	0
Z(PRGACT)	400000	;BITS TELL STATE OF ACTIVATION OF P OF P'S.
Z(USRACT)	0	;SAVED VERSION OF PRGACT.
Z(LSTPG)	0	;HIGHEST PG IN USE BY USER.
Z(LECLIN)	0	; FLAG THAT SAYS THIS BLOCK HAS A CLOCK REQUEST IN TO HAVE ITSELF KILLED, WHEN IT BECOMES FREE
;FORGET THIS CELL ;Z(DPKTIM)	0	; WORD INDICATING TIME KEY WAS STRUCK
;AND THIS ONE	  ;Z(DPGTIM)	0	; TIME GRAPHICS WENT OUT
Z(DPRLSF)	0	; FLAG THAT SAYS THIS PROGRAM HEADER BELONGS TO A DETACHED JOB AND IS TO BE RELEASED
Z(PRGCW)	0	; COMMAND WORD FOR USER GRAPHICS TRANSFERS
Z(PRGJMP)	0	; JUMP TO USER PROGRAM
Z(PRGCNT)	0	; DUMMY COUNT WORD
Z(DPHOLD)	0	; -1 IF HOLDING
Z(GWORD)	0	; GARBAGE WORD. HOLDS EVERYTHING WHAT WON'T FIT ELSEWHERE
			; B0 1-PAGE PRINTER SIZE SET LAST BY CONSOLE COMMAND, 0-BY UUO
			; B1 SAME FOR PAGE PRINTER Y-POSITION.
			; B2 SAME FOR LINE HOLD COUNT
			; B3 SAME FOR GLITCH HOLD COUNT
			; B9-17 LINE HOLD COUNT
			; B18-26 GLITCH HOLD COUNT
			; B27-35 CHAR WHICH ACTIVATED LINED
Z(LHCNT)	0	; LINE HOLD COUNTDOWN
Z(GLHCNT)	0	; GLITCH HOLD COUNTDOWN
Z(LEB)

		0	;DP DOES A JMS TO HERE TO DISPLAY EDITOR BUFFER.
		0
Z(LEPPV)	0	;POINTER POSITION VECTOR FOR EDITOR POINTER.
Z(III)		LVW (-5,-14)	;WILL BE 0 ON DD
			;DRAW THE POINTER.
Z(VDTMP)	LVW (12,0)	;TEMP MAPPING STORED HERE ON DD
Z(PPHPOS)	LVW (-5,14)	;USED AS TEMP FOR DD CURSOR ROUTINES
		XWD ZZQ+LEB+1,DISRST+40
			;RESTORE BEAM POSTION.
Z(LELMAR)	LVW(0,0,I)
			;LEFT MARGIN VECTOR... USED FOR SHIFTING LONG LINES.
Z(LEBUF)	REPEAT BUFL,<XWD ZZQ+LEB,DISJMP>
			;THE EDITOR BUFFER.

Z(LEHPOS)	0	;HORIZONTAL POSITION OF POINTER (IN COLUMNS).
Z(CCPOS)	0	;LOGICAL POSITION OF POINTER, IN CHRS. FROM START OF LINE.
Z(FCPOS)	0	;NO. OF CHRS. IN LINE.
Z(LELWD)	0	;POINTER TO LAST WORD OF BUFFER IN USE (ONE BEFORE THE RETURN JMP).
Z(LSTHP)	0	; SAVED HORIZONTAL POSITION
Z(LEENQ)	0	; NUMBER OF LINE EDITOR TASKS IN THE QUEUE
Z(LEENQ2)	0	; NUMBER OF SCREEN REFRESH AND/OR HELP TASKS IN QUEUE.
Z(LECHPS)	0	; SAVED VALUE OF HORIZONTAL POSITION
Z(MAXPT)	ZZQ+LEBUF+BUFL-4
			;MAXIMUM ALLOWABLE VALUE OF LELWD (I.E., END OF BUFFER).
Z(NUMARG)	0	;REPEAT ARGUMENT.
Z(LEARG)	0	; REPEAT ARGUEMENT SAVED FOR <ESC>G COMMAND AND ITS FRIENDS
Z(LEPNT1)	0	;BYTE POINTER CORRESPNDING TO EDITOR POINTER.
Z(NTABPT)	0	;BYTE PTR. TO NEXT TAB IN LINE TO RIGHT OF CURRENT POS.
Z(NTABCT)	0	;NUMBER OF SPACES IN NEXT TAB.
Z(LEACT)	0	; LINE EDITOR TELLS DPYKILL THAT A CHARACTER HAS BEEN TYPED HERE
Z(LEINV)	0	; MEANS LINE EDITOR BUFFER IS NOW INVALID
Z(LEWAKE)	0	; THIS IS SET BY A TRANSFER THAT IS ABORTED BECAUSE OF INVALID BUFFER
Z(NCRS)		0	; NUMBER OF LONG-LINE CRLFS IN LINE
Z(LEVP)		0	; VERTICAL POSITION OF LINE EDITOR LAST TIME IT WENT OUT
Z(LEHP)		0	; HORIZONTAL POSITION OF LINE EDITOR
Z(LENCRS)	0	; NUMBER OF LINES IT TOOK LAST TIME IT WENT OUT.
Z(LECVP)	0	; LAST CURSOR VERTICAL POSITION
Z(LECHP)	0	; LAST CURSOR HORIZONTAL POSITION
Z(LECLK)	0	; MEANS CLOCK REQUEST IS IN
Z(LETXC)	0	; MEANS LINE EDITOR TEXT HAS CHANGED
Z(LEMISS)	0	; INDICATES A TRANSFER MISSED DUE TO BUFFER INVALID
Z(LECC)		0	; SAYS WHETHER AN <ESC>C HAS BEEN TYPED
Z(LELINE)	0	; LINE NUMBER OF LINE EDITOR
Z(CVP)		0	; CURRENT CURSOR VERTICAL POSITION
Z(CHP)		0	; CURRENT CURSOR HORIZONTAL POSITION
Z(WHOTAB)	0	; WHO LINE TIME,,JOB #
Z(WHORUN)	0	; TIME WHEN RUN TIME SHOULD BE UPDATED ON WHO LINE
Z(LETBPT)	0	;PTR. TO THE LETAB ENTRY FOR THIS DPY.
Z(LCH)		0	;
Z(DPYLEN)

ORG ZZQ			; DON'T LOSE ANY STORAGE OVER THESE DEFINITIONS
↑STRTBL:BLOCK DPYNUM	;THIS TABLE, INDEXED BY DISPLAY NO.,
			;GIVES NORMAL START POINT FOR ITS PROGRAM.

	0		;STPTBL(-1) FOR HOLDING MESSAGE
↑STPTBL:BLOCK DPYNUM	;SAME THING FOR STOP POINTS.
	0		;STPTBL(DPYNUM)	FOR IDLE STATE

↑SELTBL:BLOCK DPYNUM	;POINTERS TO SELECT WORDS
↑RSTTBL:BLOCK DPYNUM	;RESTART (I.E. BEGINNING OF PRGM) POINTS.
↑LETAB:	BLOCK DPYNUM+DDNUM	; LINE EDITOR HEADERS ARE HERE
	BLOCK DPYNUM	;EXTRA 6 0'S FOR VDSMAP ROUTINES ADDRESSING "SHADOW" CHANNELS

↑DXFLAG:	0	;APAIR OF FLAGS FOR SYNCHRONIZING DP RESTARTING WITH
↑DRUNCT:	0	; NUMBER OF CURRENTLY RUNNING DISPLAY
↑SAVTAC:	0	; DPY NUMBER DURING ERROR TYPEOUT
↑DPCNI:		0	; DP CONI BITS
↑LCPDL←←100		;LENGTH OF CLOCK PUSHDOWN LIST.
↑DPYPDL:	IOWD LCPDL,CLKPD
			;SPECIAL CLOCK LEVEL PDL.
↑CLKPD:		BLOCK LCPDL+1
		0
↑CLKQUE:	BLOCK 6*<DPYNUM+DDNUM>

↑CLKQ:		POINT 36,CLKQUE-1,35
			;MAIN PTR. TO CLK QUE.

↑WTFLG:		0	;IF -1, WE ARE SUSPENDING NORMAL CLK. SERVICE TO WAIT FOR FREE STG.

↑SVAC:		BLOCK 20
↑DPYMAP:	BLOCK JOBN
↑NBS←←=100
↑TBL:		BLOCK NBS+1
			; PLACE TO BUILD BLOCK MAP FOR UPGMOVE
↑ERRP:		0	; ROUTINE THAT IS ENTERED WITH A JSA
		JRST ERRP2
↑FREEHD:	0
↑FSWTHD:	0
↑FSWT2H:	0
↑FREEC:		0
↑FREETL:	0
↑FRETOT:	0
↑FSWC:		0
↑CLKLVL:	0	; SAYS WE ARE AT CLOCK LEVEL
↑CLKQTMP:	0	; TEMP CELL
↑FSW2C:		0
; DATA DISK DATA STORAGE

↑DDSTART:	0	; UUO LEVEL SETS THIS TO START UP DD. SEEN BY APRINT.
↑DDCNT:		3B2	; NUMBER OF TIX THIS PROGRAM IS ALLOWED TO RUN BEFORE IT IS TIMED OUT.
↑DDDSP:		0	; THIS IS THE I-LEVEL DISPATCH ADDRESS.
↑DDRET:		0	; WE JUMP INDIRECT HERE TO RETURN FROM I-LEVEL
↑DDRTN:		0	; EVERYONE JSRS HERE TO RETURN
		JRST @DDRET
↑DDSAC1:	0	; ACCUMULATORS . . .
↑DDSAC2:	0
↑DDSAC3:	0
↑DDSTAC:	0
↑DDSDAT:	0
↑DDNXT:		0	; ADDRESS OF NEXT TASK TO BE DONE
↑DDCUR:		0	; DATA BLOCK ADDRESS CURRENTLY IN USE
↑DDCURT:	0	; TASK BLOCK ADDRESS CURRENTLY IN USE
↑DDCURQ:	0	; THIS IS WHERE I-LEVEL PUTS THE CONTROL BLOCK ADDRESS BEFORE DISMISSING
↑DDCOL:		0	; HERE WE KEEP COLUMN ADDRESSES
↑DDLST:		0	; ADDRESS OF LAST FRAME LOOKED AT
↑DDOFF:		0	; SET TO -1 TO INHIBIT DD TRANSFERS
↑DDQUE:		0	; HERE LIES THE DATA DISC QUEUE
↑DDSQ:		0	; WE SAVE THE ENTIRE TASK QUEUE HERE
↑DDLFD:		0	; WE SAVE THE FIELD WORD OF THE LAST FRAME HERE.
↑LEBFR:		CW 1,46,2,0,3,2
		CW 3,2,4,0,5,0
		0
		0
↑DDCURS:	0
		CW 3,1,4,0,5,0
		REPEAT 20,<2>
		CW 0,0,3,1,3,1
		0
↑CZPNT:		POINT 36,CURZWD-1,35
↑CURZWD:	BLOCK 4
↑DDCRLF:	REPEAT =40,<ASCID /  
/>
		0
↑DDRUN:		0	; TELLS IF DD IS CURRENTLY RUNNING
↑DDERRS:	CW 1,46,2,0,3,1
		CW 3,2,4,0,5,0
		XWD DDCRLF,DISJMP

↑WSERC:		CW 1,17,2,0,3,2
		CW 1,46,2,0,3,2
		0
↑DPYARN:	0	; DENOTES THAT 'CONSOLE AVAILABLE' MESSAGE HAS BEEN RUN THIS TICK
↑DPYAVL:	LVW -600,0,I,A,2,4
		XWD 770000,DISSEL
		<BYTE (8)377>!DISSKP
		XWD TTYLOK,20!DISRST
		<BYTE (8)367,0,367>!DISKPN
		XWD DPYAV2,DISJMP
		XWD MAINTMODE,20!DISRST
		<BYTE (8)367,0,367>!DISSKP
		XWD DPYAV1,DISJMP
DPYAV2:		ASCID /SYSTEM IS DOWN!!!/
		0

DPYAV1:		ASCID /TAKE ME I'M YOURS!/
		0
;*** RPH PATCH TO CATCH LOSING DP
		XWD .+1,24
		0
		XWD .-2,20
;END PATCH

↑AVLWHO:	CW 1,17,2,0,1,46	;WE SEND AN ERASE DURING FIRST FIELD ONLY
		0
		AVLWDD,,DISJMP
		ASCID / 
/
↑DDWMES:	1				;PATCH HERE TO DISPLAY OTHERS
		ASCID /                                 Take Me I'm Yours!
/
		0

AVLWDD:		ASCID /             DD JBS,TCOR  R,RCOR UCOR  NL DSKQ
/
		COMDD,,DISJMP

↑DDUNMS:	ASCID /                             No Data Disk Channels Left
/
		0

↑DDDMES:	ASCID /                                   System Is Down!
/
		0

↑AVLLN:		0		;XWD FIRST,SECOND TEXT LINE FOR AVL MSG
↑AVLVP:		CW 3,2,4,2,5,4	;GETS CLOBBERED BY PHANTOM STARTER
↑WHOKLU:	0		;COUNTS DOWN TO AVL MSG SHIFT OR -1 TO GOOSE WHOSER

↑DDSTRS:	CW 1,46,2,0,3,2
		CW 3,2,4,1,5,11
		ASCID /   ********************** →HOLDING← **********************/
		CW 0,0,3,2,3,2
		0

↑DPYHOL:	0
↑DPYHLD:	XWD 77,DISSEL
		LVW (-600,660,I,A,2,2)
		ASCID /   ********************** →HOLDING← **********************/
		COMIII,,DISJMP			;GO DISPLAY SYSTEM LINE OF WHO LINE

;MODEL WHO LINE BLOCK (COPIED INTO FREE STORAGE)
↑TITLE:		0		;III JSRs to here.  FOR DD, COMMAND WORD GOES HERE
		BYTE(11)<-1000>,740(3)2,2(2)1,2(3)3 ;III POSITION WORD.  DDs PUT CMD WORD HERE
		COMDD,,DISJMP	;IIIs get a no-op deposited here.
↑WTEND←←.-TITLE
↑WTTYS:		REPEAT 3,<ASCID/     /
		>		;SPACE FOR FIRST PART OF USER WHO LINE
		ASCID	/  /	;three nulls here (NOT TO MENTION 2 SPACES)
		REPEAT 3,<ASCID/     /
		>
		ASCID	/   K        -             -        / ;7 words of constants
		REPEAT 4,<12
		>		;SPACE FOR SEGMENT NAME AND ALIAS
		ASCID	/
/				;CRLF TO FINISH USER LINE
↑WLINK←←.-TITLE
		0		;DD HALT.  FOR III, A JMP TO TITLE GETS PUT HERE

;DISPLAY SUBROUTINE FOR SYSTEM DATA ON FIRST LINE OF WHO LINE
↑COMIII:	BYTE(11)<-1000>,770(3)2,2(2)1,2(3)3	;III POSITION WORD.
↑WHOSEL:	770000,,DISSEL	;HERE WE SELECT WHICH III'S GET THE SYSTEM WHO LINE
↑COMDD:				;DDD PROCESSOR ENTRY POINT
↑COMWHO:	ASCID/                   ,       ,       K    %   D          / 
		ASCID/              :  
/				;CONSTANTS IN SYSTEM LINE
		DISKPN		;SKIP ALWAYS, IF III
		.+2,,DISJMP	;NO COMMENT!
		0		;III HALTS HERE
		CW (3,2,3,2,3,2);SELECT COL 2.  DISKPN ISN'T QUITE A NO-OP ON DDD!
↑DDDRET:	DISJMP		;DD JMP TO USER LINE OF WHO LINE.  ADR PLACED IN LH

↑DDTAB:	BLOCK 40	;CHANNEL TABLE
↑DDFLST:	0	;FREE LIST HEADER, MUST FOLLOW DDTAB
↑DDFCNT:	0	;# FREE CHANS
↑AVLCHN:	11	;CHAN FOR AVAIL MSG
↑AVLBIT:	0	;BIT   "    "    "
↑VDMAP:	BLOCK DDNUM	;THE PERMANENT MAP
	BLOCK DPYNUM	;CELLS FOR "SHADOW" CHANNELS

	BEND DPYDAT
BEGIN DTCDDB
SUBTTL	DTCDDB 06-AUG-68 DECTAPE DATA BLOCK

;DTA DEVICE DATA BLOCKS

DEFINE CAT6'(A,B),<SIXBIT /A'B/>
	
DEFINE DTCDDX!(UNIT),<
	REPEAT	DDBSKW-1,<0>	;SKEW-ZEROES
	DEVLUP,,0		;DEVCMR
	ZZ←.
IFE UNIT,<↑DTCDDB←.>
	CAT6(DTA,\<UNIT+1>)
	XWD	=10*HUNGST,200+<UNIT+1>⊗PUNITP	;LONG HUNG COUNT IS INSERTED WHEN A DUMP
						;MODE OPERATION HAPPENS.
	0
	XWD	IFE UNIT-(DTCNUM-1),<MTCDDB,DTCDSP;>LINK,DTCDSP
	LINK←.-4
	XWD	DVDIR+DVIN+DVOUT+DVDTA+DVLNG,154403
	0
	0
	XWD	PROG,0
	XWD	PROG,0
	XP	DTNEXT,.-ZZ	;LH=NEXT OUTPUT BLOCK NO.
					;RH NEXT INPUT BLOCK NO.
	0
	XP	DTERR,.-ZZ	;ERROR COUNT OF FATAL ERRORS
	0
	XP	CURENT,.-ZZ	;POINTER TO CURRENT DIR ENTRY(ABSOLUTE)
	0
	XP	UFREE,.-ZZ	;RH=LAST BLOCK USED. 1 FOR A CLEARED DIRECTORY
	XWD	0,0		;LH=BLKCNT WHILE TAPE INACTIVE, INIT AT BLD TIME
	XP	UDIR,.-ZZ		;LINK TO DIRECTORY IN DATA BLOCK
	.+1		;ADDR DTA DIRECTORY
	BLOCK	200		;DTA DIRECTORY
>

UNIT←DTCNUM-1
; THE FOLLOWING EXPANSION OF THE MANY DECTAPE DEVICE DATA BLOCKS
; HAS BEEN XLIST'ED OUT FOR YOUR READING CONVENIENCE.
; THEY ACTUALLY LOOK LIKE THIS:
; REPEAT DTCNUM,<DTCDDX(UNIT)
;         UNIT←UNIT-1>
XLIST
REPEAT DTCNUM,<DTCDDX(UNIT)
	UNIT←UNIT-1>
LIST
;TEMPORARY STORAGE FOR DECTAPE SERVICE
↑BLKPTR:	0	;BLKI/BLKO POINTER.
↑DMPPTR:	0	;DUMP MODE BLKI/BLKO POINTER
			;MOVED TO BLKPTR AT INTERRUPT
↑DMPLST:	0	;RELATIVE POINTER TO CURRENT DUMP MODE
			;COMMAND LIST WORD
↑DTOTAL:	0	;TOTAL ERROR COUNT FOR SYSTEM SINCE IT WAS
			;LOADED(COUNT NOT CLEARED AT SYSTEM INITIALIZATION)
↑DFTOTAL:	0	;TOTAL FATAL ERROR COUNT FOR SYSTEM SINCE LOADED
			;IE FAILED DTTRY (3 USUALLY) TIMES
↑DTTAC:		0	;PLACE TO SAVE TAC ON DT CHANNEL
↑DTUNIT:	0	;DT UNIT IN BITS 30-32,DT PI CHAN. BITS 33-35
↑ERRFLG:	0	;DATA MISSED BY DC IF NON-ZERO
↑RBNCNT:	0	;COUNT DOWN NUMBER OF REVERSALS SEEKING BLOCK
↑UBUF:		0	;ABS. ADR. OF SECOND WORD OF USER BUFFER
↑UERRCN:	0	;NO. OF ERROR SO FAR ON THIS OPERATION
↑UPROG:		0	;XWD PROTECTION,RELOCATION FOR JOB USING DECTAPES
↑UDPROG:	0	;XWD 0,RELOCATION(USED BY DUMP MODE ONLY)
↑USVDB:		0	;ADR. OF DEVICE DATA BLOCK FOR CURRENT UNIT
↑BLKCNT:	0	;COUNT OF NO. OF BLOCKS WHICH CURRENT JOB
			;USING DECTAPES CAN DO BEFORE HAVING TO GIVE
			;THEM TO ANOTHER JOB IF ONE IS WAITING
			;THIS IS SETUP AT UUO LEVEL AND DECREMENTED AT
			;JOB DONE TIME AT INTERRUPT LEVEL
			;IF TAPE MUST SEARCH FOR BLOCK, COUNT IS SET TO ZERO
			;MEANING THAT QUANTUM IS EXCEEDED IMMEDIATELY


↑UBKN:		0
↑BNDISP:	0
↑CONSZ1:	0
↑RDBN:		0
		JRST RDBN1
↑WTRV:		0
		JRST WTRV1
↑RDRV:		0
		JRST RDRV1
↑ENPT:		0
		JRST ENPT0
↑ENPT1:		0
		JRST ENPT2
↑DMPADV:	0
		JRST DMPA0
↑DCLOC:		0
↑DCLOC1:	0

	BEND DTCDDB
IFN FTDISK,<
;;TASK BLOCK DEFINITIONS . . .

FBADR←←0
FBWC←←1
FBDONE←←2
FBDA←←3
FBRETRY←←4
FBBND←←5
FBJOB←←6
FBLINK←←7

↓FBSIZ←←FBLINK+1

;;NUMBER OF BANDS THE THING HAS . . .

↓NBANDS←←170
MAXFB←←40

BEGIN FBDAT
SUBTTL DATA FOR LIBRASCOPE SWAPPER AND FAST BAND PACKAGE

↑IEARLY:	0	;ENABLE IOP EARLY RESPONSE PRINTOUT

↑FBQUE:		0	; TOP OF TASK LIST

↑SYSBAND:	100B23
↑SYSBND:	100		; BAND WHERE SYSTEM LIVES
↑DDTBAND:	101B23

↑FBBANDLIST:	REPEAT 60,<-1>	;0-57	;NO DISK HERE ANY MORE
		REPEAT 70-57,<0>	;60-70 OK
		-1			;71 EATS IT
		0			;72 OK
		0
		0
		-1			;75 LOSES
		REPEAT 101-75,<0>	;76-101 OK
			-1	;102	PERMANENT READ ERROR
			-1	;103	PERMANENTLY BAD!
			-1	;104	PERMANENT READ ERROR
			-1	;105	PERMANENT READ ERROR
			0	;106	OK
			-1	;107	BAD BAND 2-22-73
			0	;110	OK
			0	;111	OK
			-1		;112 BAD
		REPEAT 131-112,<0>	;113-131 OK
			-1		;132 BAD
			0		;133 OK
			0		;134 OK
			0		;135 OK
			-1		;136 BAD
		REPEAT NBANDS-136,<0>	;REST OK

↑FBBUSY:	-1
↑FBTASK:	0
↑FBACT:		0
↑FBSPARE:	BLOCK FBSIZ
↑FBSBUSY:	0
↑LASTADR:	0		;LAST SECTOR, TRACK, AND BAND
↑LASTWC:	0		;LAST WCMA SENT
↑IOPWRD:	0		;WORD IOP GOT PAR ERR ON
↑IOPWCM:	0		;IOP WCMA FOR PARITY ERROR, DATA MISS.

BEND FBDAT
>
BEGIN LPTDDB
SUBTTL LPTDDB - 10 SEPT 68 - JAM


;LPT  DEVICE DATA BLOCK
REPEAT DDBSKW-1,<0>	; PUT IN PROPER NUMBER OF ZEROS FOR SKEW PURPOSES
		DEVIBF!DEVLUP,,0		;INTERNALLY BUFFERED DEVICE
↑LPTDDB:	SIXBIT	/LPT/
		XWD	=10*HUNGST,LPTSIZ+2
↑LPTIOS:	0
		XWD	XGPDDB,LPTDSP
		XWD	DVOUT!DVLPT,4403	;MODES 13,10,1,0
		0
		0
		0
		XWD	PROG,0
↑LPTIBF:	BLOCK LPTBLN	; SYSTEM BUFFER
↑LPTDCN:	0		; DANGLING CHARACTER COUNT
↑LPTBG1:	0		;SET TO EJECT FORMS BEFORE FIRST OPERATION
↑LPTUBP:	POINT 7,LPTIBF	; UUO LEVEL POINTER
↑LPTIBP:	LPTIBF		; INTERRUPT LEVEL POINTER
↑LPTCC:		5*LPTBLN	;  TOTAL CHARACTER COUNT
↑LPTLCC:	LPTCPL		; CHARS PER LINE

	BEND LPTDDB
BEGIN XGPDDB	↔ SUBTTL DATA STORAGE FOR XGP SERVICE
;REG JAN 11 1973.  REVISED THRU 8 JUNE 1973

REPEAT DDBSKW-1,<0>
		DEVIBF!DEVLUP,,XGPCSC		;DEVICE HAS INTERNAL BUFFER.
						;(SOMETIMES)
↑XGPDDB:	SIXBIT	/XGP/
		5*HUNGST,,401			;RH = BUFFER SIZE.
↑XGPIOS:	0
		ADDDB,,XGPDSP
		DVLPT!DVLNG!DVOUT,,104401	;MODES 0,10,17,13
		0				;DEVLOG
		0				;DEVBUF
		PROG,,0				;DEVADR
		PROG,,0				;DEVOAD
		0
		0
		0

↑XGPCSC:	BLOCK	PSYNCN			;INTER PROCESSOR SYNCHRONIZATION.

↑XGPP1F:	0				;SET TO SIGNAL PDP-10
↑XGPP2F:	0				;SET TO SIGNAL PDP-6

↑XYNCNT:	0				;SYNC COUNT
↑XGPCNT:	0				;COUNTS VARIOUS THINGS
↑XGPCNY:	0				;COUNTS PAPER FEED AT END
↑XGPKIL:	0				;SET WHEN PDP-10 WANTS XGP TO DIE.

↑XGPIWD:	0				;IOWD FOR CURRENT DUMP COMMAND
↑XGPBIG:	0				;REMAINDER OF IOWD
↑XGPMDP:	0				;POINTER TO CURRENT DUMP COMMAND
↑XGPNXC:	0				;POINTER TO NEXT DUMP COMMAND
↑XGPROG:	0				;RELOC OF USER.
↑XGPGCW:	0				;GROUP CONTROL WORD.

↑XDISP1:	0				;DISPATCH LEVEL 1
		JEN	@XGPCHL			;DISMISS INTERRUPT.
						;JSR XDISP1 TO CHANGE DISPATCH AND
						;DISMISS.

↑XDISP2:	0				;DISPATCH LEVEL 2
		POPJ	P,

↑XGPAOK:	0				;PDP-6 SETS THIS ON EACH INTERRUPT.
↑XGPBIT:	0				;PDP-10 TELLS WHAT IT WANTS HERE
↑XGPGO:		0				;SET BY PDP-10 WHEN JOB LOCKED IN.
↑XGPTMP:	0				;1 CELL FOR I-LEVEL.
↑XPGOOD:	0				;CELL FOR 'GOOD CUTS'.

↑XTAKE:		0				;POINTER FOR PDP-6.
↑XPUT:		0				;POINTER FOR PDP-10
↑XIBUF:		0				;CONTAINS THE ADDRESS OF THE BUFFER.
↑XIBFND:	0				;ADDRESS OF END OF BUFFER.
↑XBFCNT:	0				;COUNT OF WORDS USED IN BUFFER.
↑XGPWSZ:	0				;SIZE NEEDED BEFORE REACTIVATION.
↑XGPBFL:	0				;FLAG SET FOR MODE 10, ZEROED FOR 17

↑XGPOST:	BLOCK	20			;OLD STATUS OF FC
↑XGPNST:	BLOCK	20			;NEW STATUS OF FC.
↑XGPFC1:	0				;SET WHEN WE WAIT FOR FC
↑XGPFC2:	0				;SET WHEN FC WAITS FOR US
↑XCLKNM:	0				;CLOCK REQUEST IDENTIFIER
↑XFCJN:		0				;FC JOB NUMBER
↑FCRQER:	0				;FLAG FOR FC NOT RESPONDING.
↑XFCADR:	0				;RELATIVE ADDRESS OF THE FC
↑XFTADR:	BLOCK	20			;ADDRESS OF FONT TABLE IN FC

↑XGPSLS:	0				;SPECIAL LINE SPACE COUNT. '177'1'42

↑XCFH:		0				;CURRENT FONT HEIGHT
↑XCFBL:		0				;CURRENT BASE LINE
↑XCFCPA:	0				;CURRENT COLUMN POSITION ADJUSTMENT.
↑XHMAX:		0				;MAXIMUM HEIGHT IN CURRENT LINE.
↑XLBL:		0				;XLBL CURRENT LINE'S BASE LINE.
↑XFTCAD:	0				;CURRENT FONT ADDRESS (RELOCATED)
↑XSCNLN:	0				;CURRENT SCAN LINE IN LINE
↑XGPERC:	BLOCK	4			;ERROR CONDITION CODES.
↑XGPPG2:	0				;"PAPER PAGE" COUNT
↑XGPHIP:	0				;"HEADING IN PROGRESS"
↑XGPHDW:	0				;IOWD FOR HDB
↑XGPHDB:	BLOCK	=26			;TEXT FOR HEADINGS. USE HDW
↑XGPAT0:	0				;THREE TEMP CELLS FOR 
↑XGPAT1:	0				;PAPER PAGE MACRO EXPANSION.
↑XGPAT2:	0
↑XSVCAD:	0				;SAVE OLD FONT WHILE IN HEADING.
↑XGPIGO:	0				;SET TO -1 BY PDP6 WHEN DATA XFER
↑XUSBEG:	0				;COLUMN OF BEGINNING UNDERSCORE.
↑XCHBGO:	0				;SET TO ADDRESS OF FIRST TEXT NODE.
↑XVNODE:	0				;SET TO ADDRESS OF VECTOR NODE.

;LIST HEADERS FOR COMPILER/TEXT PROCESS
↑XVNFL:		0				;VECTOR NODE FREE LIST
↑XTNFL:		0				;TEXT NODE FREE LIST
↑XATLH:		0				;ACTIVE TEXT LIST
↑XASVLH:	0				;ACTIVE NARROW VECTOR LIST
↑XALVLH:	0				;ACTIVE WIDE VECTOR LIST
↑XPENDH:	0				;PENDING QUEUE HEAD
↑XPENDT:	0				;PENDING QUEUE TAIL

XGPPDX:		BLOCK	20			;PDL FOR CHANNEL 4 COMPILER.
↑XGPPDL:	IOWD	20,XGPPDX		;POINTER TO PDL

↑XACT4:		0				;FLAG CH4 NEEDS ACTIVATION.
↑XCYPOS:	0				;Y POSITION FOR CURRENT LINE.
↑XGPLYP:	0				;LAST Y POSITION QUEUED
↑XFREBA:	0				;POINTER TO BLOCK IN FC.
↑XNODUS:	0				;# OF TEXT NODES IN USE.
↑XTOFRM:	0				;SET TO -1 WHEN THERE IS TEXT Q'ED
↑XLFTKF:	0				;SET TO -1 WHEN WE DID KERN ADJUST
↑XGPSAC:	BLOCK	20			;CH4 CO-ROUTINE AC'S


↑XFLAPA:	0				;MORE BITS FOR FLAPPER
↑XFLAPB:	0				;BITS TO DECIDE WHEN TO FLAP
↑XFLAPC:	0				;FLAPPER COUNT
↑XCUTQ:		BLOCK	=48			;QUEUE OF CUT POINTS
↑XCUTBP:	POINT 36,XCUTQ-1,35		;BYTE POINTER TO XCUTQ

;THE REST OF THIS IS INITIALIZED BY RESET
↑NTNODE←←=16					;(DEFAULT) NUMBER OF TEXT NODES
↑NVNODE←←=100					;(DEFAULT) NUMBER OF VECTOR NODES
↑XGPBL1←←4000					;(DEFAULT) SIZE OF SYSTEM BUFFER

↑XGPPS1:	=200				;TOP TO FIRST LINE MARGIN
↑XGPPS2:	=1790				;TOP LINE TO LAST LINE SIZE.
↑XGPPS3:	=200				;LAST LINE TO BOTTOM MARGIN
↑XGPLMR:	=200				;LEFT MARGIN
↑XGPRMR:	=1650				;RIGHT MARGIN
↑XGPILS:	=4				;INTER-LINE SPACING
↑XNTNOD:	NTNODE				;NUMBER OF TEXT NODES
↑XNVNOD:	NVNODE				;NUMBER OF VECTOR NODES
↑XGPBLN:	XGPBL1				;SIZE OF SYSTEM BUFFER

↑XMSET:	=200					;SET MARGINS (ETC) FROM THIS BLOCK
	=1790
	=200
	=200
	=1650
	=4
	NTNODE
	NVNODE
	XGPBL1

BEND	XGPDDB
BEGIN PTRDDB -- PAPER TAPE READER DEVICE DATA BLOCK
SUBTTL PTRDDB - J. SAUTER - 10-NOV-68

		REPEAT DDBSKW-1,<0>	; PUT IN ALL THE EXTRA WORDS
		DEVLUP,,PTRCSC		; PUT IN ADDRESS OF CONTROL CELLS
↑PTRDDB:	SIXBIT /PTR/
		XWD =10*HUNGST,41
		0
		XWD PTPDDB,PTRDSP
		XWD DVPTR+DVIN,14403
		0
		0
↑PTRADR:	XWD PROG,0
↑PTRPTR:	0
		0			;PTR COUNTER
↑PTRACT:	0
↑PTRIN1:	0
↑PTRADV:	0
↑PTRSTR:	0
↑PTRCHR:	0
↑PTRDSC:	0			;SET TO -1 TO MAKE PTR DISCONNECT.
↑PTRCSC:	BLOCK PSYNCN
↑PTRCON:	0			;SET TO PTRCN1 OR PTRCN2.

BEND PTRDDB
BEGIN PTPDDB -- PAPER TAPE PUNCH DEVICE DATA BLOCK
SUBTTL PTPDDB - JAM - 10-NOV-68

REPEAT DDBSKW-1,<0>		; PUT IN PROPER NUMBER OF SKEW WORDS
		DEVIBF!DEVLUP,,PTPCSC
				; TELL WORLD THAT THIS IS AN INTERNALLY BUFFERED DEVICE . . .
				; AND THAT IT HAS CONTROL CELLS
↑PTPDDB:	SIXBIT /PTP/
		XWD =20*HUNGST,41
↑PTPIOS:	0
IFE IMPSW,<	XWD LPTDDB,PTPDSP>
IFN IMPSW,<	XWD DDBMDL,PTPDSP>
		XWD DVPTP+DVOUT,14403
		0
		0
↑PTPPTR:	0
↑PTPADR:	XWD PROG,0
↑PTPIBP:	0		; INTERRUPT-LEVEL BYTE POINTER
↑PTPUBP:	0		; UUO-LEVEL POINTER
↑SYSPDL:			;SYS INIT PDL MOVED HERE FROM TTY DDB 5/6/74 BH
↑PTPBUF:	BLOCK PTPBLN	; BUFFER ITSELF
↑PTPFCN:	0		; PUNCH FEED COUNT
↑PTPBCN:	0		; BUFFER CHARACTER COUNT
↑PTPIDS:	0		; INTERRUPT-LEVEL DISPATCH LOCATION
↑PTPUDS:	0		; UUO-LEVEL DISPATCH LOCATION
↑PTPCPW:	0		; CHARACTERS PER WORD
↑PTPACT:	0		; FLAG ASKING TO TURN ON PTP
↑PTPMOD:	0		; MODE OF OPERATION
↑PTPSID:	0		; P2 ASKING P1 TO CALL SETIOD
↑PTPCSC:	BLOCK PSYNCN	; 2-PROCESSOR SYNCHRONIZATION CONTROL REGISTERS
↑PTPCON:	0		; SET TO PTPCN1 OR PTPCN2

BEND PTPDDB
BEGIN SCNDDB
;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES

;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE
;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATIONS 11
;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE
;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS
;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB
;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF,
;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME. IF DYNAMIC
;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN
;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X"
;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED.

;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF:
;INPUT---POINTED TO BY TTIBUF
;	ALL CHARACTERS TYPED GO INTO THIS BUFFER. IN ADDITION, ALL
;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON
;(APRSER) ARE STORED HERE.
;OUTPUT BUFFER---POINTED TO BY TTOBUF
;	ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS
;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF
;CHARACTER STRINGS.

;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER
;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX). THE LAST
;FOUR CHARACTERS IN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD
;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE
;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE
;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR
;ALL BUFFERS.  IN THIS MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO
;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE
;DEFINED TO BE 0-10 (OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED
;BUFFER PARAMETER WORD REGARDLES OF BUFFER.
;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS:
;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT
;	HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER. THIS WORD IS
;	ONLY READ BY THE CURRENT CODE.  UPON THE ADDITION OF DYNAMIC
;	BUFFER ALLOCATION, THIS WORD WOULD BE LOADED IN THE SAME FORMAT
;	AT THE TIME THAT THE BUFFER WOULD BE BUILT.
;
;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO
;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THAN READING LH
;OF TTXBUF
;
;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE
;	BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER.
;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED
;	BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER
;	(NOT THE AMMOUNT OF FREE SPACE LEFT)
;TX'TAKR OR TAKR(DAT)---BYTE POINTER USED BY ALL ROUTINES TO PICK UP
;	CHARACTERS FROM THE BUFFER. WHEN THE TAKR IS EQUAL TO THE PUTR,
;	THE BUFFER IS "EMPTY".
;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN
;	BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER.
;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE
;	PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON"
;	THE TAKR. WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS
;	MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT)
;TX'SYNC OR TSYNC(DAT)---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED
;	INTO INPUT BUFFER.
;SCANNER DEVICE DATA BLOCK.
;REMAINING SCN DDB'S ARE GENERATED
;OUT OF LINE AT BUILD TIME.
;THIS DDB IS USED FOR THE CTY AND NEVER KILLED   BH 5/6/74

↑OFFSET←←5	;NUMBER OF COMPILED IN DDBS
↑TTPLEN←←SCNNUM+DPYNUM+DDNUM+PTYNUM+1

Z←←0;
LINK←←0
REPEAT DDBSKW,<XWD DEVAOA,0>		;IGNORE IOACT FOR OUTPUT UUO
↑SCNDDB:
↑TTYLST:
	ZZ←.
	SIXBIT /CTY/			;DEVNAM
	TCONLN⊗13+UTTYBF+1		;DEVCHR(NO HUNG TIME),,BUFFER SIZE+1
	Z				;DEVIOS
	XWD	LINK,SCNDSP		;DEVSER
	XWD	DVTTY+DVIN+DVOUT,15403	;DEVMOD (ALLOWS MODES 0,1,10,11,13,14)
	Z				;DEVLOG
	Z				;DEVBUF
	XWD	PROG,0			;DEVIAD
	XWD	PROG,0			;DEVOAD
	XP	ACTBTS,.-ZZ		;BREAK TABLE
	-1
	777700,,37600
	374000
	XP	ACTMOD,.-ZZ		;END OF TABLE AND SPECIAL BITS
	7,,600000
	XP	TTYPTR,.-ZZ		;TTYPTR
	Z
	XP	TTIBUF,.-ZZ
	XP	TTICHR,STTIBF*4		;9 BIT CHARACTERS FOR INPUT
	XWD	TTICHR,TTYLST+TIBF-1
	XP	TIPUTR,.-ZZ
	1100,,TTYLST+TIBF
	XP	TIPCTR,.-ZZ
	1
	XP	TITAKR,.-ZZ
	1100,,TTYLST+TIBF
	XP	TITCTR,.-ZZ
	1
	XP	TIFCTR,.-ZZ
	TTICHR
	XP	TISYNC,.-ZZ
	Z
	XP	TTOBUF,.-ZZ
	XP	TTOCHR,STTOBF*5		;7 BIT OUTPUT
	XWD	TTOCHR,TTYLST+TOBF-1
	XP	TOPUTR,.-ZZ
	700,,TTYLST+TOBF
	XP	TOPCTR,.-ZZ
	1
	XP	TOTAKR,.-ZZ
	700,,TTYLST+TOBF
	XP	TOTCTR,.-ZZ
	1
	XP	TOFCTR,.-ZZ
	TTOCHR
	XP	PTYPTR,.-ZZ
	Z
	XP	SAVDDB,.-ZZ		;FOR FILES COMMAND
	Z
	XP	IMLHAC,.-ZZ		;BITS 34:35 HOLD IMLAC BUCKY BITS.
	Z
	XP	TIBF,.-ZZ
	BLOCK	STTIBF			;THE ACTUAL INPUT BUFFER
	XP	TOBF,.-ZZ
	BLOCK	STTOBF			;THE ACTUAL OUTPUT BUFFER
;NO. OF CHAR. IN MON. BUF.
	XP	SCNDDS,.-ZZ		;SIZE OF SCN DDB
↑LINSAV: 0
↑LINSV1: 0
↑↑TTYLOK:	0
↑DKBCHR:	0
GLOBAL TTPLEN
	0	;LINTAB(-1) FOR DDBSRC
↑LINTAB: BLOCK TTPLEN
GLOBAL PTYNUM
↑PTYJOB:	BLOCK PTYNUM

BEND SCNDDB
;DIALER DATA AREA
BEGIN DILDAT

;AC SAVE LOCS
↑DILLIN:	0
↑DILTAC:	0
↑DILJ:		0

;THIS PART ZEROED AT DILINI
↑DILZBG←←.
↑DILJOB:	BLOCK DILNUM	;JOB # OF JOB OWNING THIS DIALER
↑DILCNI:	BLOCK DILNUM	;LAST CONI BITS FROM DILINT
↑DILIDS:	BLOCK DILNUM	;DILINT DISPATCH ADDRESS
↑DILZND←←.-1

BEND DILDAT
BEGIN MTCDDB  --  DEVICE DATA BLOCK FOR MAG TAPES.
SUBTTL MTCDDB - J. SAUTER, STANFORD, MAG. TAPE DEVICE DATA BLOCKS


GLOBAL SCNDDB
LINK←SCNDDB

DEFINE CAT6'(A,B),<SIXBIT /A'B/>

DEFINE MTCDDX(UNIT),<
	REPEAT DDBSKW-1,<0>	;SKEW-ZEROS
	DEVLUP,,0
	ZZ←.
IFE UNIT,<↑MTCDDB←.>
	CAT6(MTA,\UNIT)
	XWD	=60*HUNGST,MTSIZ+1+<UNIT>⊗PUNITP
	0
	XWD LINK,MTCDSP
	LINK←.-4
	XWD DVMTA!DVIN!DVOUT!DVLNG,154403
	0
	0
	XWD PROG,0
	XWD PROG,0
↑MTCENT←.-ZZ
	0	;ERROR COUNT FOR THIS UNIT:
			;0-8 = LOGN. P.E.
			;9-17 = LAT. P.E.
			;18-26 = ILL OP.
			;27-35 = DATA MISSED.
↑MTCBKN←.-ZZ
	0	;RECORD COUNTER
>
	UNIT←MTCNUM-1
; THE FOLLOWING IS XLIST'ED OUT FOR YOUR READING CONVENIENCE
; IT ACTUALLY LOOKS LIKE THIS:
; REPEAT MTCNUM,<MTCDDX(UNIT)
;       UNIT←UNIT-1>
XLIST
	REPEAT MTCNUM,<MTCDDX(UNIT)
	UNIT←UNIT-1>
LIST

;TEMP CELLS AND CONTROL DATA
↑MTEOFF:	0	;EOF FLAG
↑MTDEV:		0	;XWD COMMAND,DDB ADDR
↑MTDCCN:	0	;BLKO/BLKI POINTER FOR REDO
↑DCWRD:		0	;BLKO/BLKI POINTER FOR DC
MTCSAV:		0	;DC COMMAND
↑MISSED:	0	;-1 IF DC HAS PARTIAL WORD
↑MTERCN:	0	;ERROR COUNTER
↑MTREWN:	0	;UNITS REWINDING AND IN IOW -1=NONE, 0=ONE
↑MTCMDP:	0	;DUMP COMMAND LIST POINTER
↑SVCNTR:	0	;DUMP COMMAND IOWD NEG. WORD COUNT
↑MDCSAV:	0
↑MTIDSP:	0	;ADDRESS TO TRANSFER TO ON NEXT MAG TAPE INTERRUPT

↑MTDCND:	0	;JSR HERE WHEN BLKO/BLKI COUNTED OUT
		JRST MTDCN1

	BEND MTCDDB
BEGIN SPWDAT -- DATA FOR SPACEWAR
SUBTTL SPWDAT - JAM, STANFORD, 7-NOV-68, DATA FOR SPACEWAR SERVICE


↑SPWA:	BLOCK 20	; P1 ACCUMULATORS
↑SPWB:	BLOCK 20	; P2 ACCUMULATORS
↑SPWSAC:BLOCK 20	; USER'S ACCUMULATORS
↑SP2SAC:BLOCK 20
	0		; JOB NUMBER OF JOB WHICH HAS 
			; PDP-6 SPACEWAR ASSIGNED.
↑SPWBUT:
	0		; SPACEWAR BUTTONS
↑SPWACT:
	0		; FLAG MEANING A SPACEWAR JOB EXISTS
↑SPWCSC:
	BLOCK PSYNCN	; SPACEWAR 2-PROCESSOR SYNCHRONIZATION CELLS

;WARNING! DON'T CHANGE POSITION OF SPWGO,SP2GO,JBTST2 - SEE SPWINI - REG
↑SPWGO:	BLOCK	JOBN	
↑SP2GO:	BLOCK	JOBN
↑JBTST2:BLOCK	JOBN

	BEND SPWDAT
;SCHEDULER DATA AREA . . .
BEGIN SCHDAT
SUBTTL	SCHDAT 11 SEPT 67 SCHEDULER DATA AREA

;SCHEDU DATA


↑SCHMQT:	QQMQT
↑JOBQUE:	BLOCK JOBN	; MINUS THE QUEUE NUMBER THE JOB IS IN
; TABLES FOR JOB PRIORITY CALCULATIONS

↑SCHBEG:			;HERE TO SCHEND ZEROED BY NXTINI
↑JLCYET:	0
↑JLFACTOR:	0		;JLFACTOR/JLTIME = USEFUL PROCESSOR LEVEL
↑RJLFACTOR:	0		;RECIPROCAL JLFACTOR
↑OINTIME:	0		;HERE WE SAVE INTIME+P1PID FROM LAST JLCAL CYCLE
↑OUTIME:	0		;HERE WE SAVE UPTIME+P1PID FROM LAST JLCAL CYCLE
↑JLRIT:		0		;RECENT INTERUPT FRACTION *1000
↑ORDYET:	0
↑JBTPRI:	BLOCK JOBN	; JOB'S PRIORITY
↑JBTNPR:	BLOCK JOBN	; JOB'S NEW PRIORITY
↑JBTJL:		BLOCK JOBN	; POINTER TO FS TABLE OF INSTANTANEOUS JOB LOAD
↑JBTJLH:	BLOCK JOBN	; OLDEST JOB LOADING.
↑SCHEND←←.-1

↑GCBITS:	BLOCK 2		;BIT TABLE FOR GCMCK ROUTINE

; QUEUE TABLES . . .
		BLOCK MXQUE
↑JBTQ:		BLOCK JOBN

IFN FTSWAP,<
; SWAPPER TABLES . . .

↑SWPJMX:	0
↑SWPMXP:	0
↑SWPLMX:	0
↑SWPLMJ:	0
↑JBTSWP:	BLOCK JOBN
↑JB2SWP:	BLOCK JOBN	;LH LIKE JBTSWP FOR SPARE COPY OF SEGMENTS
				;30-35 DATA DISC CHANNEL LIST. 18-29 AVAILABLE.
;LEAVE NEXT LOCS IN ORDER FOR WHO
↑BIGHOL:	0		;CURRENT BIGGEST HOLE IN CORE (1K BLOCKS)
↑FINISH:	0		;FINISH,FORCE,FIT AND XPANDF ARE FLAGS IN SWAP
↑FORCE:		0		; NUMBER OF THE JOB THAT WILL GO OUT NEXT
↑FIT:		0		; NUMBER OF THE JOB THAT WILL COME IN NEXT
↑XPANDF:	0
↑FULCNT:	0		;PRINT DISK IS FULL EVERY 30 SECONDS
↑SEGWAIT:	0		; NUMBER OF JOB WAITING FOR UPPER SEGMENT
↑MAXSIZ:	0		;SIZE OF LARGEST JOB WHICH MIGHT BE SWAPPED OUT
↑MAXJBN:	0		;NUMBER OF THAT JOB
↑MAXRSZ:	0		; SIZE OF LARGEST RUNNABLE JOB
↑MAXRJB:	0		; JOB NUMBER OF LARGEST RUNNABLE JOB.
↑MAXSSZ:	0		; SIZE OF LARGEST SEGMENT.
↑MAXSJB:	0		; JOB NUMBER OF LARGEST SEGMENT.
↑SUMCOR:	0		; THE SWAPPER TOTALS THE CORE SIZES OF THE JOBS
				; IT IS CONSIDERING FOR SWAPOUT AND PUTS THAT TOTAL HERE
↑NEEDED:	0		;THE AMOUNT NEEDED TO SWAP JOB IN FIT IN
>

;SHARABLE DEVICE JUST BECOME AVAILABLE(EXTENDED TO OTHER QUEUES TOO)
;APPROPRIATE ENTRY IS SET NON-ZERO WHEN SCHEDULER SHOULD LOOK
;AT THAT QUEUE TO FIND A JOB TO RUN
;WSAVAL CONTAINS THE NO. OF JOBS WITH IO WAIT SATISFIED(0=NONE)

DEFINE X!(A)
<
↑A!AVAL:	0
>

↑AVALTB:	QUEUES		;GENERATE THE AVAL FLAGS
;SHARABLE DEVICE REQUEST TABLE(GENERALIZED FOR OTHER QUEUES TOO)
;CONTAINS THE NUMBER OF JOB WAITING TO USE SHARBLE DEVICE
;WSREQ AND RNREQ ARE UNUSED

DEFINE X!(A)
<↑A!REQ:	0
>


↑REQTAB:	QUEUES	;GENERATE REQ TABLE

;WORDS USED TO "REMEMBER" JOB NUMBERS
;BITS 35--9 CORRESPOND TO JOB NO'S 1--27


↑QJOB:	BLOCK JOBN	;Q TRANSFERS AT OTHER THAN CLOCK LEVEL
IFN FTSWAP,<
↑XJOB:	BLOCK JOBN	;CORE EXPANSION BY SWAPOUT-IN
>

;DATA AND STORAGE AREA USED FOR SWAPPING.  ON THE LIBRASCOPE
;   DISK, BANDS 1-15 ARE USED FOR SWAPPING, EACH BAND
;   CONTAINING 76K WORDS.

↑SQREQ:	0			;C(LH)=NEG. OF SIZE OF READ/WRITE
				;C(RH)=LOC. OF FIRST WORD TO READ/WRITE
↑SERA:	0			;SIGN IS 1 IF A READ
				;C(RH)=BLOCK NUMBER BEFORE READING,
				;    ERROR BITS AFTER READING.
↑SWPCNT:	0		;SWAPPER COUNTER.  WHEN LEQ 0, RESET TO
				;INITIAL VALUE AND RUN SWAPPER.
↑SERACT:	0			;COUNTER FOR ERRORS
↑CORMX:		0			; MAXIMUM CORE AVAILABLE TO LOSERS
↑ISONE:		0			; BOOLEAN SAYING THERE IS A JOB WHICH CAN FIT IN WITH THIS UPPER

XP CONVMD,3
	;CONVERSION FROM 1K CORE BLOCKS TO DISK BLOCKS
	;(SHIFT COUNT)
	BEND SCHDAT
SUBTTL	DATA AREA FOR CORE MANAGEMENT SYSTEM
;	 - JAM 8-24-69		- REG 2-24-72

RMEMSI:	0		;FIRST PHYSICAL NXM ADDRESS
MEMSIZ:	0		;LOGICAL NXM FOR SYSTEM = FREE STORAGE LOCATION
CORCSC:	BLOCK	PSYNCN	;P2 CAN PLAY WITH CORE CELLS!
CORBEG←←.		;HERE TO COREND ZEROED BY CORINI
FSBPT:	0		;BYTE POINTER TO 2ND BYTE IN CORTAB
CORBLK←←=256		;THE MAXIMUM NUMBER OF K WE MIGHT HAVE
CORTAB:	BLOCK 101	;9 BITS PER K OF MEMORY
CORLST:	0		;BYTE POINTER TO 2 ND BIT OF NXM IN CORTAB
CORTAL:	0		;THE NUMBER OF 1K HOLES IN CORE
IFN FTSWAP,<
CORMAX:	0		;LARGEST POSSIBLE JOBREL
>
SHFWAT:	0		;# OF JOB WAITING TO BE SHUFFLED
HOLEF:	0		;ADDRESS OF 1ST HOLE IN CORE
CORE2P:	0		;POINTER TO LAST BYTE OF SYSTEM IN CORTAB
COREND←←.-1		;END OF AREA ZEROED BY CORINI
↓%SWPL←←=196*2000	;SWAPPING LIMIT - MAX JOB SIZE
SWAPLI:	%SWPL		;CORE CELL WITH SWAPPING LIMIT SET.
↓JBTPLN←←136		;SIZE OF JOB PDL HELD IN FREE STORAGE.
			;SOME OF THE JOBPDL IS RESERVED FOR JOBDATA AREA

LOCKNO:	0		;JOB NUMBER OF USER OF THE LOCK UUO.
LOKPOS:	0		;PROT,,REL WE DESIRE FOR JOB IN LOCKNO.
LOKTOP:	0		;BOTTOM OF USER CORE.
SUBTTL	FREE STORAGE PARAMETERS
IFN FTSWAP,<FSNINIT←←1;>FSNINIT←←5	;NUMBER OF K TO CLAIM INITIALY
TSHF←←3			;COARSENESS OF FREE STORAGE (EXPONENT OF 2)
↓TRIVIAL←←1⊗TSHF	;SIZE OF MINIMUM BLOCK
NFSB←←20		;NUMBER OF DISTINGUISHABLE BLOCK SIZES
FSBEG←←.		;ADDRESS TO ZERO AT FSINI
FSCSC:	BLOCK	PSYNCN	;SYNCHRONIZATION CELLS FOR FS
FSCNT:	0		;COUNT OF PEOPLE WAITING FOR F.S.
FSLIST:	BLOCK	JOBN	;AND THEIR JOB NUMBERS
JBTPDL:	BLOCK	JOBN	;PDL POINTER FOR UUO PDL FOR EACH JOB
FSCLKF:	0		;FLAG TO THE SWAPPER THAT FS IS EXPANDING
FSGVKF:	0		;FLAG TO SAY LOOK FOR A K TO GIVE BACK
FSRTL:	0		;LIST OF BLOCKS TO BE RETURNED
FSNEWK:	0		;SET TO -1 WHEN MERGING IN A NEW 1K CHUNK
FSCKCT:	0		;COUNT TICKS UNTIL COMPUTING CHECKERBOARDING
FSBUSY:	0		;AMOUNT OF FS THAT'S IN USE RIGHT NOW.
FSAVB:	BLOCK	2*NFSB	;BASES FOR LISTS OF FREE BLOCKS
FSRPQ:	BLOCK	NFSB	;COUNT OF FS REQUESTS BY SIZE
FSBLUZ:0		;COUNT NUMBER OF TIME FSBUSY IS FUCKED UP.
FSNCLK:	0		;SET WHEN YOU NEED FSCLK CALLED.
			;OR OF FSRTL,FSCLKF, AND FSGVKF
FSIPTR:	FSLIST		;POINTER TO ADD JOBS TO FSLIST
FSOPTR:	FSLIST		;POINTER TO TAKE JOBS FROM FSLIST
FSHUNG:	0		;SET TO -1 TO INDICATE A DISASTER.
FSGTUF:	0		;FLAG FOR SPECIAL FSGET
SPFSNT:	0		;TOTAL # SPARES NEEDED
FSEND←←.-1		;END OF BLOCK ZEROED BY FSINI
;SPARE LIST CONTROL BLOCKS
;FORMAT OF SPARE LIST HEADER

		;WD0 LIST HEADER
SFSIZE←←1	;B0 AVOID REG FS, 1-8 # TO KEEP, RH SIZE
SFLINK←←2	;HEADER LINK (BOTH WAYS)
SPFSN←←3	;# SPARES CURRENTLY NEEDED
SFLOSS←←4	;LH TYPE (TEXT) RH LOSS COUNT

SFNWT←←200000	;PREVENTS WAITING AT UUO LEVEL

NSPLN←←3	;# SPARES OF STUFF ALLOC PER LINE

SFHEAD:	DPYFS,,DDFS	;THE HEADER HEADER

DDFS:	0		;DD Q BLOCKS
	400000+NDDSPQ⊗9,,QLENGT
	TTYFS
	0
	[ASCIZ /DATA DISK QUEUE/],,

TTYFS:	0		;TTY DDBS
	NSPLN⊗9,,SCNDDS+DDBSKW+1
	DDFS,,DHFS
	0
	0

DHFS:	0		;DPY HEADERS
	NSPLN⊗9,,DPYLEN
	TTYFS,,LPFS
	0
	0

LPFS:	0		;LINE PNTR TABLES
	NSPLN⊗9,,=80
	DHFS,,PPFS
	0
	0

PPFS:	0		;PAGE PRINTER INITIAL BLOCKS
	NSPLN*2⊗9,,BLKSIZ	;2 OF THESE PER PP
	LPFS,,DPYFS
	0
	0

DPYFS:	0		;RANDOM DPYSER DATA
	BLKSIZ
	PPFS,,
	0
	0
BEGIN TVDDB -- TV CAMERA DEVICE DATA BLOCK
SUBTTL TVDDB - J. SAUTER, STANFOR, 25-FEB-68, TV CAMERA DEVICE DATA BLOCK



	REPEAT DDBSKW-1,<0>	; EXTRA STANDARD DDB WORDS
	DEVLUP,,0
↑TVDDB:	SIXBIT /TV/
	XWD =2*HUNGST,0
	0		;TVIOS, NOT USED.
IFE ELFNUM <XWD	DTCDDB,TVDSP>
IFN ELFNUM <XWD ELFDDB,TVDSP>
	XWD DVTV!DVIN!DVLNG,100000
	0
	0
	XWD PROG,0
	XWD PROG,0
	0
	0
	0		;DEVACC
	0		;DEVCNT
	0		;DEVBLK
	0		;DEVBKO
	0		;DSKBUF
	0		;DSKCNT
	0		;SETCNT


	BEND TVDDB
IFN ELFNUM <SUBTTL ELFDDB - PDP-11 BARE MACHINE MODE
BEGIN ELFDDB - 7 MAY 74 BO

REPEAT DDBSKW-1,<0>
		DEVIBF!DEVLUP,,0	;It sort of has an internal buffer
↑ELFDDB←.				;(at least, it doesn't set IOACT).
		SIXBIT /ELF/
		0
		0
		XWD DTCDDB,ELFDSP
		XWD DVOUT+DVIN+DVLNG,140000	;Dump mode only for now.
		0
		0
		XWD PROG,0
		XWD PROG,0
↑ELFLOC←.
		0			;ELFSER defines its variables
		0			;in terms of ELFLOC.
		0
		0

BEND ELFDDB
↓ELFDDB←ELFDDB
↓ELFLOC←ELFLOC
>;IFN ELFNUM
BEGIN ADDDB -- DEVICE DATA BLOCK FOR A/D AND D/A.
SUBTTL ADDDB - J. SAUTER, STANFORD, 25-FEB-68, AD DEVICE DATA BLOCK
	REPEAT DDBSKW-1,<0>	; EXTRA DDB WORDS
		DEVLUP,,0
↑ADDDB:		SIXBIT /AD/
		XWD =24*HUNGST,0
		0		;ADIOS
		XWD	ADCDDB,ADDSP
		XWD DVOUT+DVIN+DVLNG,140000	;FLUSH MODE 15 8/7/73
		0
		0
		XWD PROG,0
		0
↑ADLOC1:	0
↑ADLOC2:	0
↑ADLOC3:	0
↑ADLOC4:	0
↑ADBKO:		0
↑ADERR:		0
↑ADADV:		0
↑ADBLK:		0
↑ADACT:		0
↑ADBKX:	0
↑ADJSR:	0
↑ADJSRL:	0

↑AD2INT:  0
	EXCH TAC,ADBKO
	EXCH TAC,ADADV
	JUMPL TAC,CONT
	MOVE TAC,AD2INT	;MAKE IT LOOK LIKE THE INTERRUPT WENT OFF ON
	MOVEM TAC,@ADJSR		;THE NORMAL CHANNELL.
	MOVE TAC,ADBKO
	JRST ADINT
CONT:	EXCH TAC,ADBKO
	JRST 12,@AD2INT


	BEND ADDDB
BEGIN ADCDDB - NEW AD/DA CONVERTER - (JAM 2-5-74)
SUBTTL ADCDDB - DEVICE DATA BLOCK FOR NEW AD/DA CONVERTER

	REPEAT DDBSKW-1,<0>
	DEVLUP,,ADCCSC
↑ADCDDB:SIXBIT /ADC/		; ANALOG-DIGITAL. INPUT ONLY.
	77*HUNGST,,0
↑ADCIOS:0
	DACDDB,,ADCDSP
	DVIN!DVLNG,,140000
	0
	0
	0
	0
↑ADCCSC:BLOCK PSYNCN
↑ADCZB:		; BEGINNING OF BLOCK TO ZERO AT INITIALIZE TIME
↑ADCBKI:0	; CURRENT IOWD
↑ADCNBK:0	; NEXT IOWD
↑ADCRCB:0	; STARTUP IOWD FOR RECYCLE MODE
↑ADCTHR:0	; THRESHHOLD FOR RECYCLE MODE
↑ADCCNO:0	; CONO WORD TO START UP
↑ADCERA:PROG,,0	; ADDRESS OF PLACE IN USER CORE TO PUT ERROR CODES
↑ADCRUN:PROG,,0	; ADDRESS OF USER CORE WD TO 'SETOM' WHILE ADC RUNNING
↑ADCRCW:PROG,,0	; ADDRESS OF USER CORE WD TO PUT RECYCLE IOWD WHEN DONE
↑ADCP1L:0	; P1'S SYNC LOCATION
↑ADCP2L:0	; P2'S SYNC LOCATION
↑ADCSTI:0	; STRAY ADC INTERRUPTS
↑ADCWPS:0	; WORDS PER SECOND AT THIS CLOCK RATE AND PACKING
↑ADCZND:	; END OF BLOCK TO ZERO

↑ADCTAC:0	; SAVED ACCUMULATOR FOR I-LEVEL (MUSN'T ZERO THIS!)
↑ADCNOH:0	; WHEN ≠0, INHIBITS HUNG TIMEOUT


	REPEAT DDBSKW-1,<0>
	DEVLUP,,DACCSC
↑DACDDB:SIXBIT /DAC/
	77*HUNGST,,0
↑DACIOS:IO,,0
	TVDDB,,DACDSP
	DVOUT!DVLNG,,140000
	0
	0
	0
	0
↑DACCSC:BLOCK PSYNCN
↑DACZB:		; BEGINNING OF BLOCK TO ZERO AT INITIALIZE TIME
↑DACBKO:0	; CURRENT IOWD
↑DACNBK:0	; NEXT IOWD
↑DACCNO:0	; CONO WORD TO START UP
↑DACERA:PROG,,0	; ADDRESS OF USER CORE WD TO PUT ERROR CODES
↑DACRUN:PROG,,0	; ADDRESS OF USER CORE WD TO `SETOM' WHILE DAC RUNNING
↑DACP1L:0	; P1'S SYNC LOCATION
↑DACP2L:0	; P2'S SYNC LOCATION
↑DACSTI:0	; STRAY DAC INTERRUPTS
↑DACWPS:0	; WORDS PER SECOND AT THIS CLOCK RATE AND PACKING
↑DACZND:	; END OF BLOCK TO ZERO

BEND ADCDDB
BEGIN APRDAT	↔	SUBTTL	APRDAT 7 NOV 68	APRSER DATA
IFN FTBAT,<
↑BATYET:	=10*JIFSEC		;START AFTER 10 SECONDS
↑BATPNT:	0			;POINTER INTO BATMAN, ROBIN AND BATFLG

;ZERO IN EITHER BATMAN OR ROBIN MEANS NO RUN!
↑BATMAN:	'[ONCE]'	;SYSTEM STARTUP HELPER
		'*SPY* '	;ACCOUNTING
		'[LIST]'	;NEW SPOOLER
		'[XSPL]'	;XGP SPOOLER
		'*-SL-*'	;SERVICE LEVEL MONITOR
		'[-NS-]'	;NEWS SERVICE (AP)
		'<RMND>'	;REMINDER FANTOM
IFN IMPSW,<	'LOGGER'	; IMP MESSAGE SWITCHER  >
IFN FTHG, <	'*-HG-*'	;STATISTIC GATHERER	>
		'PONYSY'	;PRANCING PONY BILLING SYSTEM
		0		;1 PATCH SPACE
↑BATLEN←←.-BATMAN

↑ROBIN:		'  1  2'	;SYSTEM STARTUP HELPER, (HEAVY)
		'ACTSYS'	;ADDRESS OF THIS GUY
		'SPLSYS'	;NEW SPOOLER
		'SPLSYS'	;XGP SPOOLER
		' SLSYS'	;LOC OF SL MONITOR
		' NSSYS'	;NEWS SERVICE (AP)
		'RMDSYS'	;REMINDER
IFN IMPSW,<	'NETSYS' >
IFN FTHG, <	' HGSYS'	;STATISTICS PROPRIETOR	>
		'PNYSYS'	;PRANCING PONY SYSTEM
		0		;PATCH AREA

;ALFRED, THE FAITHFUL BUTLER.
↑ALFRED:	BLOCK	BATLEN	;SPACE FOR TIME REQUESTS

;POLICE COMMISSIONER GORDON MEMORIAL TABLE (PLEASE REMOVE YOUR FEET)
;PRIVILEGES FOR PHANTOMS
↑GORDON:	PRIPRV!DEVPRV!LUPPRV,,0	;SYS STARTER CAN DO ANYTHING!
		MESPRV!LUPPRV,,0	;SPY (NEEDS MES FOR AUTOLOGOUT)
		REAPRV!MESPRV!LUPPRV,,0	;LPT SPOOLER
		REAPRV!MESPRV!LUPPRV,,0	;XGP SPOOLER
		SSLPRV!LUPPRV,,0	;SERVICE LEVEL SYSTEM
		REAPRV!LUPPRV,,0	;NEWS SERVICE (AP)
		LUPPRV,,0		;REMINDER
IFN IMPSW,<	0			;LOGGER		>
IFN FTHG, <	ACWPRV!LUPPRV,,0	;HE DIDDLES HGYET	>
		LUPPRV,,0		;PRANCING PONY SYSTEM
		0			;PATCH AREA
>;END OF FTBAT


↑ONCEI:		JSR ONCE
↑SYSTHERE:	0			;-1 => SYSTEM IS ON THE L'SCOPE DISK

↑DAMESS:	ASCIZ /-JAN-/
↑DISMON:	ASCIZ /-JAN-/		;RPH FOR DISDATE
↑MONPTR:	0
↑FIXBUF:	BLOCK FIXLEN
↑ERRYET:	-1

IFN FTSHF1K,<
↑SHFTAC:	0
↑SHFEND:	0
↑SHFJOB:	0
↑SHFBLK:	0
>

↑TIMDAT:	0		;<DATE>,,<TIME IN SECS>
↑INITIM:	0		;AS TIMDAT, TIME OF LAST RELOAD/RE-INITIALIZATION.

; BEGINNING 2-PROCESSOR SPLIT DATA AREAS

↑P1DATA:
↑SPWUUF:	0		;SET WHEN SPACEWAR IS ACTIVE
↑SPWTMO:	0		;SPACEWAR TIMEOUT COUNT
↑SPWBLO:	0		;LOCATION OF BLOWN UP SPACEWAR JOB
↑SPWXCT:	0		;CONTAINS JRST 2,@UUO0 OR SOMETHING ELSE
↑INTACT:	0
↑INTNF:		0
↑INTACS:	BLOCK 20
↑INTSAC:	BLOCK 20
↑INTDISP:	0
↑INTSP:		0
↑INTREQ:	0
↑INTQUANT:	0
↑CLKSV:		CLKSAVE
↑CLKESV:	CLKESAVE
↑...TMP:	0
↑APRTAC:	0
↑APRAC1:	0
↑APRAC2:	0
↑APRJ:		0
↑APRCN:		APRCON
↑APRIN1:	0
↑APRIN2:	0
↑APRIN3:	0
↑APRID:		P1PID
↑APRCH:		APRCHL
↑APRERR:	0		;APR ERROR BITS ON NON-EX MEM, ETC.
				;SET BY APRSER, CLEARED BY CLK ROUTINE(CLOCK)
↑APRPC:		0		;PC WHEN APR ERROR DETECTED
↑APRPLN←←140
↑APRPDL:	IOWD APRPLN,APRPD
↑APRPD:		BLOCK APRPLN
↑ERRPLN←←200
↑ERRPD:		IOWD ERRPLN,ERRPDL
↑ERRPDL:	BLOCK ERRPLN
↑DSFLAG:	0
↑JOB:		0
↑SJOB:		0
↑JOBDAT:
↑JOBADR:	0
↑LASTPR:	0
↑USRREL:	0

;LOCATIONS COPIED FROM JOB DATA AREA INTO MONITOR WHEN A JOB RUNS
;THIS PREVENTS THE USER FROM CLOBBERING THEM AND MAKES IT
;EASIER FOR THE MONITOR TO LOCATE THESE QUANTITIES WHEN IT
;NEEDS TO FOR THE CURRENT JOB
;CONTENTS ARE COPIED BACK WHEN JOB BECOMES INACTIVE(SEE CLOCK)
;COMPARE WITH JOB DATA AREA(SEE JOBDAT)

↑USRPRT:			;FIRST LOC. OF PROTECTED JOB DATA
↑USRHCU:	0		;HIGHEST USER IO CHANNEL IN USE
				;0 MEANS EITHER NONE OR CHAN. 0 IN USE
				;NEG, MEANS SAVE-GET HAS ACTIVE IO EVEN THOUGH USRJDA
				;TABLE IS OVERWRITTEN BY GET.
				;RH=ADR. OF SAVE-GET DEVICE(USED BY ANY ACT ROUT. IN
				;IN CORE SHUFFLER
				;ONLY CHAN. ASSIGNMENTS IN USE ARE COPIED INTO
				;MONITOR WHEN JOB RUNS
↑USRPC:		0		;JOB PC WHEN SCHEDULER IS CALLED
↑USRDDT:	0		;RH=STARTING ADR. OF USER DDT,LH UNUSED
↑USRJDA:	BLOCK	20	;RH=JOB DEVICE ASSIGNMENTS (DEVICE DATA BLOCK ADDRESSES)
				;LH=UUOS DONE SO FAR FOR THIS CHANNEL(SEE SYSPAR)
				;0 MEANS NO DEVICE INITIALIZED ON THIS CHANNEL
↑USRLO←←USRJDA
				; FIRST LOC CLEARED BY SETUSR ROUTINE
				;ON A CALL [SIXBIT /RESET/]
				;ALSO CLEARS USRHCU
↑USRLO1←←USRLO+1		; FIRST LOC+1
↑USRHI←←.-1			; FIRST LOC CLEARED BY SETUSR

↑CHKYET:	0
↑UUO0:		0
		JRST UUO1
↑UUO2:		0	;JSR HERE FOR OPCODES 100-127
		JRST UUO3
↑UUOLOC:	0
↑CLOCK:		POINT 36,CIPWT-1,35
↑MONSUM:	0
↑NULDAT:	BLOCK 140
↑PALIVE:	0
↑NULBAD:	0
↑CIPWT:		BLOCK 2*JOBN
↑USRSAV:	0		;TEMPORARY FOR UUO HANDLER(IMPURE ROUTINE!)
↑CLKFLG:	0		;NON-ZERO WHEN CLK INTERRUPT FORCED FOR ANY REASON
↑CLKS17:	0
↑USAVPC:	0		; SAVED PC ON ILM TRAPS
↑CLKPDL:	BLOCK CLKPLN
↑CLKCH:		CLKCHL
↑OTHERID:	0		; CONTAINS THE OTHER PROCESSOR'S IDENTIFICATION
↑TIMEFF:	0
↑TIMEF:		0		;NON-ZERO FOR CLOCK INTERRUPT ON APR
				;SET BY APRSER, TESTED AND CLEARED BY CLK ROUTINE
↑TIME:		0		; TIME OF DAY IN TICKS SINCE MIDNIGHT
↑THSDAT:	0		;TODAY'S DATE((Y-1964)*12+M-1))*31+(D-1)
↑UPTIME:	0
↑INTIME:	0
↑SCHEDF:	0		;FORCED RESCHEDULING FLAG FOR CLK ROUTINE
				;USED TO FORCE RESCHEDULING WHEN JOB IS IN EXEC MODE
↑UUOXIT:	JEN @UUO0	;UUO EXIT INST, SOMETIMES CONO PI,PIOFF (SEE USRXIT CODE)
↑UUOXI:		JEN @UUO0	;BACKUP COPY FOR RESTORING ABOVE
↑INTHLD:	0		;FLAG TO DISABLE INTNOW (SEE USRXIT)

↑PDATALEN←←.-P1DATA

↑P2DATA:
		BLOCK PDATALEN

↑P1PID←←0
↑P2PID←←PDATALEN
↑SYSBEG←←.		;HERE TO SYSEND ZEROED AT RELOAD OR INITIALIZATION
;	↑AFOOL:		0	;PART OF APRIL 1 HACK
↑UUO.SA:	BLOCK 20	;HACK TO SAVE AC'S AT THE VERY LAST UUO.
↑...TAC:	0
↑LASTDI:	0	;LAST DISASTER TIME
↑LASTRE:	0	;LAST RESTART TIME
↑SHFWRD:	0	;TOTAL COUNT OF WORDS SHUFFLED BY SYSTEM
↑COMCNT:	0	;# OF COMMANDS TYPED-IN BUT NOT DECODED.
			;SET BY SCNSER, DECREMENTED BY COMCON
↑HNGTIM:	0	;HUNG DEVICE TIME COUNT CHECK FOR HUNG IO
			;DEVICES WHEN THIS GOES TO ZERO (ONCE A SECOND)
↑STUSER:	0	;JOB CURRENTLY USING THE SYSTEM TAPE
			;NEEDED SO CONTROL C WILL NOT TIE UP SYSTEM TAPE

↑APRLST:	0		; CLOCK INTERRUPT LIST
↑ESTINT:	0		; -1 → GOT INTO CH7 FROM ESTOP WITH INTACT SET
↑JBTSTS:	BLOCK	JOBN	;JOB STATUS BITS
REPEAT 0,<
↑JB2STS:	BLOCK	JOBN	;TWO PROCESSOR INTERLOCKED STATUS BITS
↑JBTOWN:	BLOCK	JOBN	; WHAT PROCESSOR OWNS WHICH JOB
↑JBTCSC:	BLOCK	PSYNCN
>
↑PDLCSC:	BLOCK	PSYNCN	; PDL SETUP INTERLOCK
↑JBTDVW:	BLOCK	JOBN	; DDB ADDRESS OF DEVICE THIS JOB WAITS FOR
↑JBTGSL:	BLOCK	JOBN	; JOB'S GUARANTEED SERVICE LEVEL
↑NJOBS:		BLOCK	JOBN	; NUMBER OF JOBS POINTING TO THIS SEGMENT
↑CJOBS:		BLOCK	JOBN	; COUNT DOWN TABLE FOR SCHEDU
↑UUOPC:		BLOCK	JOBN	; THIS IS WHERE THE UUO-LEVEL PC IS STORED
↑UUOOPC:	BLOCK	JOBN	; THIS IS WHERE THE UUO PC ONE BACK IS SAVED
↑JBTUPC:	BLOCK	JOBN	; SAVE UUO-LEVEL PC HERE FOR DEBREAK
↑JBTADR:
↑JBTDAT:	BLOCK	JOBN
↑JBTPR2:	BLOCK	JOBN	;PEEK-POKE TABLE
↑JBTLIN:	BLOCK	JOBN	;TTY LINE NO. OF JOB. (=-1 IF DETACHED.)
IFN FTLOGIN,<
↑JBTPRV:	BLOCK	JOBN	;JOB ACTIVE PRIVELEGE BITS
↑JB2PRV:	BLOCK	JOBN	;JOB PASSIVE PRIVELEGE BITS
↑JBTTPV:	BLOCK	JOBN	;JOB TEMPORARY PRIVILEGE BITS
↑PRJPRG:	BLOCK	JOBN	;PROJECT PROGRAMMER NAME OF JOB OWNER
IFN FTDSKPPN,<
↑DSKPPN:	BLOCK	JOBN	;DISK ALIAS PPN
>;FTDSKPPN
↑SLRMAX←←20			;MAXIMUM NUMBER OF SL RESERVATIONS
↑SLCOST:	0		;=0,1,2 DEPENDS ON TIME OF DAY,TIME OF WEEK
↑SLNRES:	0		;NUMBER OF SL RESERVATIONS
↑SLRES:		BLOCK	SLRMAX	;TABLE OF SL RESERVATIONS
>
↑JOBNAM:	BLOCK	JOBN	;NAME OF CURRENT PROGRAM (FOR WHO)
↑JBTKCJ:	BLOCK	JOBN	;KILO CORE JIFFIES USED BY THIS JOB
↑JBTBTM:	BLOCK	JOBN	;LOGIN TIME FOR A JOB
↑JOBPPN:	BLOCK	JOBN	; DIRECTORY CURRENT PGM CALLED FROM
↑JOBCRD:	BLOCK	JOBN	;PROGRAM'S CREATION DATE (FROM FILE RETRIEVAL)
IFN FTDISK,<
↑JBTUFD:	BLOCK	JOBN	;LOGICAL ADDR OF USER'S UFD.
↑CUSLOC:	0		;SAME OF [1,3] UFD.
>
↑JOBDEV:	BLOCK	JOBN	; DEVICE THAT JOB WAS CALLED IN FROM
↑JOBLOG:	BLOCK	JOBN	; LOGICAL DEVICE NAME
↑RTIME:		BLOCK	JOBN	; RUN TIME AT LAST "TIME" COMMAND
↑TTIME:		BLOCK	JOBN	;TOTAL RUN TIME
↑FTIME:		BLOCK	JOBN	;<DATE>,,<TIME IN SECS> WHEN JOB LAST RUN
↑XTIME:		BLOCK	JOBN	;RUN TIME WHEN LAST ACTIVATED OUT OF TTY INPUT WAIT
↑JBTWAT:	BLOCK	JOBN	; TIME WAITING FOR SYSTEM (NOT IN IOWQ OR STOPQ)
↑JB2WAT:	BLOCK	JOBN	; RECENTLY SAVED VALUE OF JBTWAT (FOR WHO LINE)
↑JBTRNB:	BLOCK	JOBN	;CPU TIME USED SINCE JOB'S LAST PRIORITY CALCULATION
IFN FTSWAP,<
↑STIME:		BLOCK	JOBN	; SET TO -1 WHEN CORE IMAGE IS MODIFIED
>
GLOBAL TTPLEN
IFN FTTTYBUG,<	↑TTCBCK:	BLOCK	3	>;TEMP FOR COMCNT BUG TRAP
↑ASTAB:		BLOCK	DDNUM+DPYNUM	;MAPPING TABLE FOR AUDIO SWITCH
↑ASBTAB:	BLOCK	DDNUM+DPYNUM	;BEEP DURATION
↑PAGNOW:	0		;-1 => PAGING NOW
↑TTYTAB:	BLOCK	TTPLEN
↑TPYTAB:	BLOCK	PTYNUM
↑PTYTAB:	BLOCK	PTYNUM
↑CRKYET:	0
↑RSTBEG←←.			;THIS AREA CLEARED ON RESTARTS
IFN FTDISK,<
↑JBTIOP:	BLOCK	JOBN	;IO PUSH/POP POINTERS
>
↑JBTSIN:	BLOCK	JOBN	;SWAPIN LIST FOR COMMAND DECODER, INTS, ETC.
↑SAVSAI:	BLOCK	JOBN
↑JBTDTS:	BLOCK	JOBN	; LIST OF SEGMENTS THIS JOB HAS DETACHED
↑JBTGLU:	BLOCK	JOBN	;NON-ZERO GLUES JOB IN PLACE IN CORE.
↑JBTFS:		BLOCK	JOBN	; TEMPORARY FREE STORAGE
↑JBTMAIL:	BLOCK	JOBN	;PTR. TO LETTER ADDRESSED TO JOB.
↑JBTTCR:	BLOCK JOBN	;PNTR TO TMPCOR FILES
↑JBTMSK:	BLOCK	JOBN	;NEW STYLE INTERRUPT SYSTEM MASKS
↑JBTIEN:	BLOCK	JOBN	; INTERRUPT ENABLINGS
↑JBTIRQ:	BLOCK	JOBN	; REQUESTS PENDING
↑JBTWKM:	BLOCK	JOBN	; TELLS WHICH BITS CAUSE WAKEUP
↑JBTIIP:	BLOCK	JOBN	; INTERRUPT IN PROGRESS
↑INTDTM:	BLOCK	JOBN	; DATUM OF INTERUPT
↑UUOPTR:	BLOCK JOBN	;PNTR TO UUO SIMULATOR TABLE
↑RSTEND←←.			;END OF AREA CLEARED ON RESTARTS
IFN FTSTAT, <
↑STATS:		BLOCK	STATLEN	; STATISTICS GATHERING SERVICE
↑STATNUM:	0		; NUMBER OF TIMES WE'VE WRAPPED AROUND
>
↑JOBNM1:	0		; MAXIMUM JOB NUMBER

; WHO LINE DATA STORAGE

↑LASTUP:	0		; NEGATIVE UPTIME WHEN SYSTEM WHO LINE LAST DONE
↑LASTNL:	0		; RECENT VALUE OF NEGATIVE RUN TIME FOR NULL JOB
↑JBSRUN:	BLOCK	2	; BITS FOR JOBS THAT HAVE BEEN RUN LATELY
↑WHONXT:	0		; NUMBER OF THE III WHOSE WHO LINE WAS DONE LAST
↑WHDDNX:	0		; NUMBER OF NEXT DATA DISK CHANNEL TO GET WHO LINE
↑WHOPTR:	0		; POINTER TO THE DD THAT WAS DONE LAST (SEE DPYSER&WHOQUE)
↑WHODAT:	0		; DATE ON CURRENT WHO LINE
↑FREWAT:	0		; FREE STORAGE RELEASE WAIT LIST
↑FRETAB:	BLOCK DPYNUM+DDNUM ; FREE STORAGE POINTER FOR EACH WHO LINE
↑T15CNT:	0		;COUNT FOR 1/4 TH SECOND CLOCK
↑DKBCNT:	0		;WHEN THIS GOES NEGATIVE, DKB HARDWARE
				;  IS CHECKED (CODE IS IN CLKSER).
↑NDDXOL:	0		;OLD VALUE OF NDDXCT
↑NDDLOL:	0		;OLD VALUE OF NDDLCT
↑NDSTAT:	0		;COUNTS DOWN TO RUN FROB IN 5 SECONDS.
↑SYSEND←←.
IFN FTSTAT,<
↑STATPTR:	POINT 18,STATS	; BYTE POINTER TO STATISTICS TABLE
>
↑AUTOSYNC:	0
↑SYSTOP:	0		;FIRST LOCATION USED BY USER PROGRAMS.

;;ADDRESS BREAK CRAP . . .
↑BRKMAX←←20			; MAXIMUM NUMBER OF LEGAL PCS
↑BRKTAC:	0
↑BRKAC1:	0
↑BRKNUM:	0		; CURRENT NUMBER OF LEGAL PCS
↑BRKTAB:	BLOCK BRKMAX	; PUT GOOD PCS HERE

; DISASTER MESSAGE BUFFERS AND STUFF

↑DISLEN←←400
↑DISBUF:	BLOCK	DISLEN
↑DISPTR:	POINT	7,DISBUF
↑DISOPT:	POINT	7,DISBUF
↑DISFLAG:	0
↑DISCTR:	5*DISLEN

; ACCUMULATOR SAVE ROUTINE FOR CLKING

↑CLKSAVE:
	0
	SKIPN 17,JOBDAT+P1PID	; CURRENT JOB DATA AREA
	MOVEI 17,NULDAT+P1PID	; NO, USE NULL JOB'S
	MOVEM 16,JOBD16(17)
	MOVEI 16,JOBDAC(17)
	BLT 16,JOBD15(17)
	MOVE TAC,CLKS17
	MOVEM TAC,JOBD17(17)
	MOVE PID,[P1PID]
	JRST @CLKSAVE

↑CL2SAVE:
	0
	SKIPN 17,JOBDAT+P2PID	; CURRENT JOB DATA AREA
	MOVEI 17,NULDAT+P2PID	; NO, USE NULL JOB'S
	MOVEM 16,JOBD16(17)
	MOVEI 16,JOBDAC(17)
	BLT 16,JOBD15(17)
	MOVE TAC,CLKS17
	MOVEM TAC,JOBD17(17)
	MOVE PID,[P2PID]
	JRST @CL2SAVE

↑CLKESAVE:
	0
	HRRZ 17,JOBADR+P1PID
	ADDI 17,JOBDAC
	MOVEM 16,16(17)
	HRRZI 16,15(17)
	BLT 17,(16)
	MOVE PID,[P1PID]
	JRST CLKES1

↑CL2ESAVE:
	0
	HRRZ 17,JOBADR+P2PID
	ADDI 17,JOBDAC
	MOVEM 16,16(17)
	HRRZI 16,15(17)
	BLT 17,(16)
	MOVE PID,[P2PID]
CLKES1:	MOVE TAC,CLKS17(PID)
	MOVE PROG,JOBDAT(PID)
	MOVEM TAC,JOBD17(PROG)
	MOVE J,JOB(PID)
	SKIPN TAC,USAVPC(PID)
	MOVE TAC,@CLKCH(PID)
	SETZM USAVPC(PID)
	TLNN TAC,USRMOD		; IS PC IN EXEC?
	JRST CLKES2		; YES, CAN'T SAVE HIS PC.
	MOVEM TAC,JOBPC(PROG)
	CAMN J,SJOB(PID)
	MOVEM TAC,USRPC(PID)
CLKES2:	MOVE P,INTSP
	MOVE TAC,@CLKESV(PID)
	JRST @TAC


	BEND APRDAT
;	DATA AREA FOR PARITY SERVICE
PARBLK:	0			;SET BY CORE ROUTINES - OLD LOC OF SHUFFLED JOB
PARSJB:	0			;SAVE JOB NUMBER OF JOB BEING SHUFFLED.
PARSJN:	0			;FLAG WITH JOB NUMBER OF SHUFFLED JOB.
PARFLG:	0			;SET BY P2 WHEN IT HAS ERROR
P2RFLG:	0			;SET BY P1 WHEN IT SEES PARFLG
P2SA:	0			;PLACE FOR P2RINT TO SAVE AN AC
ERRLOC:	-1			;IF > 0 THEN LAST LOC SEEN WITH BAD PARITY
RERLOC:	0			;RELATIVE ERROR LOCATION.
PARPSA:	0			;SAVE P HERE WHILE WE USE APRPDL
ERRPC:	-1			;PC AT TIME OF ERROR

SYSERR:	0			;LEFT SIDE = -1 WHEN PARITY ERROR IS FOUND
				;IN THE SYSTEM (OR INDETERMINATE)
				;RIGHT SIDE = APR CONI BITS TO PRESERVE 
				;STATE OF SYS WR REF KLUGE.

LASLOS:	0			;SET TO JOB NUMBER OF LAST JOB THAT LOST
ERRJOB:	BLOCK	2		;BIT TABLE OF JOBS THAT HAVE LOST DURING
				;THIS PASS THROUGH CORE.

; STATISTICS COUNTERS
;  CAUTION:  THE RELATIVE ORDER OF THESE COUNTERS SHOULD NOT BE CHANGED,
;    BECAUSE THE PROGRAM MONUSE THINKS IT KNOWS WHERE THINGS ARE

IFN FTHG, <	XWD HGXMAX,HGNMAX;STBEG-2 CONTAINS # OF EACH KIND OF HG CNTR
		HGCNTS	;LOCATION STBEG-1 POINTS TO HISTOGRAM COUNTERS!  >
STBEG←←.
NCORCALLS:	0	; NUMBER OF CALLS ON THE CORE ROUTINES
NFSGETS:	0	; NUMBER OF TIMES FREE STORAGE IS GOTTEN
NFSGIVES:	0	; NUMBER OF TIMES FREE STORAGE IS RELEASED
NCOMS:		0	; NUMBER OF COMMANDS THAT HAVE BEEN DISPATCHED TO
NDLYCMS:	0	; NUMBER OF COMMANDS THAT HAVE BEEN DELAYED
NUUOS:		0	; NUMBER OF UUOS
NSCHEDS:	0	; NUMBER OF TIMES WE HAVE ENTERED THE JOB SCHEDULING LOOP
NQXFERS:	0	; NUMBER OF QUEUE TRANSFERS
NOUTSWPS:	0	; NUMBER OF SWAPOUTS - 10
NINSWPS:	0	; NUMBER OF SWAPINS
NDDQUE:		0	; NUMBER OF TASKS CREATED FOR THE DATA DISC QUEUE
NNUUOS:		0	; NUMBER OF NEW UUO DISPATCHES
NFSWAITS:	0	; NUMBER OF TIMES WE HAD TO WAIT FOR FREE STORAGE
NFSLP1:		0	; NUMBER OF LOOPS (TYPE 1) IN FSGET
NNULLJS:	0	; NUMBER OF SCHEDULINGS THAT CHOSE THE NULL JOB
NJSWITCHES:	0	; NUMBER OF TIMES JOBS WERE SWITCHED
NWSCHEDS:	0	; NUMBER OF TIMES JOBS TURN THEMSELVES OFF - 20
NTMOS:		0	; NUMBER OF TIMES JOBS GET TIMED OUT
NJRNULLS:	0	; NUMBER OF TIMES A JOB IS RUNNABLE WHILE THE NULL JOB IS RUNNING
NPWAITS:	0	; NUMBER OF FAILURES IN SYNCHRONIZATION
NLERRS:		0	; NUMBER OF TIMES THROUGH FININ1 WITH ERRORS
NSAERR:		0	; NUMBER OF TIMES THROUGH FININ1 WITH SUCCESS AFTER ERROR RETRIES
NLREQS:		0	; NUMBER OF TRANSFERS
NLRERS:		0	; NUMBER OF TRANSFERS PLUS NUMBER OF ERROR RETRIES
NFSGFA:		0	;NUMBER OF FAILURES FROM FSGET - 30
NABFE:		0	; NUMBER OF TIMES WE ADVANCED AN OUTPUT BUFFER
NABFF:		0	; NUMBER OF TIMES WE ADVANCED AN INPUT BUFFER
NFSLP2:		0	;NUMBER OF LOOPS (TYPE 2) IN FSGET
NPUSHD:		0	;MAXIMUM PUSH DOWN DEPTH USED IN A UUO PDL.
NDDFRM:		0	; NUMBER OF FRAMES CREATED FOR THE DATA DISC QUEUE
NDDLCT:		0	;-(NUMBER OF LINES SENT TO DD)
NDDLMX:		0	;MAX COUNT FOR 5 SECONDS
NDDXCT:		0	;NUMBER OF ENTRIES MADE TO DD QUEUE.-40
NDDXMX:		0	;MAX COUNT FOR 5 SECONDS
NDDL1C:		0	;COUNT OF 1 AND 2 LINE TRANSFERS TO DD.
↑NIOTS:		0	;HOW MANY NEW UUOS (700-777) HAVE BEEN CALLED
↑NSCALL:	0	;HOW MANY STANFORD CALLIS HAVE BEEN CALLED
STEND2 ←← .-1		;END OF STATISTICS SECTION (FOR *SPY*)
IFN FTHG, <
HGNMAX ←← 40		;NUMBER OF HISTOGRAM COUNTERS
HGXMAX ←← 1		;NUMBER OF "EXTRA" COUNTERS
HGSET:		0	;RESET VALUE FOR HGYET
HGYET:		0
HGCNTS:	BLOCK	HGNMAX	;HISTOGRAM COUNTERS - INCREMENTED IN HG ROUTINE
	BLOCK	HGXMAX	;EXTRA COUNTERS - NOT INCREMENTED IN HG ROUTINE
HGCH2 ← .-1		;CH2 (DISK XFER) ACTIVE TIME (AN "EXTRA" COUNTER)
HGCH6:		0	;NUMBER OF TIMES CH5 ENTERED WITH CH6 ACTIVE
			;IF HGCH6 ISN'T INCREMENTED, THEN ONE OF NEXT 4 IS:
HGSYS:		0	;# OF OCCURRENCES OF ¬(USRMOD) ∧  (CH7 ACTIVE)
HGUSR:		0	;# OF OCCURRENCES OF  (USRMOD) ∧ ¬(CH7 ACTIVE)
HGUUO:		0	;# OF OCCURRENCES OF ¬(USRMOD) ∧ ¬(CH7 ACTIVE)
HGSPW:		0	;# OF OCCURRENCES OF  (USRMOD) ∧  (CH7 ACTIVE)
HGNULL:		0	;NUMBER OF TIMES NULL JOB RUNNING ∧ ∃ JOB WAITING
HGIDLE:		0	;NUMBER OF TIMES NULL JOB RUNNING W/ EMPTY RUNQ
HGCODE:		0	;VARIOUS CLKINT SUBROUTINES SET THIS VARIOUSLY
	>
STEND←←.-1		;END OF STATISTICS SECTION